Conversation
Bring the static numbers in README.md back in sync with the released binary: startup-banner example (v9.0.0 → v9.2.0, 14/76 → 25/110), preset tool counts (core 14→25, review 19→42, full 80+→110, etc.), "20 quality checks" → 21, "LIP v2.0" → "LIP v2.3+", and drop the "v9.0" prefix on the Compound Operations heading. The npm version shield is dynamic so no change needed there. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Upstream renamed the crate; CKB follows. Mechanical rename only — no functional change to existing call sites; the Go API surface is identical. - Vendor path third_party/cartographer/mapper-core/cartographer/ → third_party/nyx-navigator/ (flattened; stale Python tooling and examples no longer carried). - Build tag cartographer → navigator. make build / make test resolve build-navigator / test-navigator. make build-fast (no Rust toolchain) unchanged. - Static lib libcartographer.a → libnavigator.a; FFI prefix cartographer_* → navigator_*; header cartographer.h → navigator.h; sync script scripts/sync-cartographer.sh → scripts/sync-nyx-navigator.sh. - Go package internal/cartographer → internal/navigator; error type CartographerError → NavigatorError. - ckb status backend label "cartographer" → "navigator". New FFI surfaces available for follow-up wiring (not yet exposed): navigator_poll_changes, navigator_doc_index, navigator_doc_context, navigator_query_docs. The navigator_render_architecture FFI shape is unchanged but accepts new format values (sequence, class, quadrant, er, ascii, html, plus cross-file sequence with an entry-point) — these can flow through getArchitecture / renderArchitecture without further bridge work. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Content edits to renamed files: build tag (//go:build navigator), package declaration (package navigator), C.cartographer_* → C.navigator_* calls in bridge.go, CFLAGS / LDFLAGS to third_party/nyx-navigator, header include navigator.h, and corresponding string updates in the sync script. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Three small fixes that surfaced from test-driving the navigator rename: 1. review_coupling.go: hidden-coupling pass only filtered the *missing* side for noise; when the *changed* side was itself a noise file (.gitignore, CHANGELOG.md, etc.) every co-change still got flagged. Added the symmetric filter; also added third_party/ to the noise prefix list (vendored code, same intent as vendor/ and node_modules/); and capped findings at 3 per changed file to match the regular pass. On the navigator rename PR: 779 → 43 hidden-coupling findings (95% reduction). 2. impact_outgoing_test.go: panic from "send on closed channel" race in the LIP fake. Cleanup closed reqC while connection-handler goroutines were still in flight on `reqC <- req`. Added a sync.WaitGroup for handlers and a tracked list of accepted conns; cleanup now closes the conns first, drains the handlers, then closes reqC. Verified clean across 20× stress under -tags navigator. 3. wide_result_budget_test.go: maxGetHotspotsBytes 10000 → 13000. Under -tags navigator each hotspot is augmented with up to 3 co-change partners from navigator.GitCochange (~1.6KB extra at limit=20). The 10000 budget was set when the augmentation didn't exist — the augmentation is intentional value-add, so accommodate it rather than truncate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…p nyx naming Re-vendors the Rust crate from upstream CodeCartographer 1.3.3 (was the interim nyx-navigator 1.1.0 fork) and renames the CKB side back to `cartographer`: - third_party/nyx-navigator -> third_party/cartographer - internal/navigator -> internal/cartographer (package cartographer, CartographerError, status backend id "cartographer") - build tag navigator -> cartographer; FFI navigator_* -> codecartographer_*; header navigator.h -> codecartographer.h; -lnavigator -> -lcode_cartographer - scripts/sync-nyx-navigator.sh -> scripts/sync-cartographer.sh - Makefile/.gitignore updated; Makefile runs the localize script via `bash` so a re-vendor (rsync drops the exec bit) doesn't break `make build` Bundles the upstream go.mod-aware resolver fix, which eliminated fabricated dependency edges that leaked to users through getArchitecture, getBlastRadius, renderArchitecture, getModuleContext, analyzeImpact, prepareChange, and the review layers/arch-health checks. On CKB itself: edges 996 -> 769 (~23% fabricated), cycles 22 -> 0, bridges 244 -> 187, health 38 -> 71. Also pulls upstream 1.2-1.3 features: six new languages (Java, C#, Ruby, Kotlin, Swift, PHP) with call graphs and class diagrams, symbol-aware BM25 search, scope-qualified reach_symbol, orientation-first ranking, and O(N) import resolution. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Re-vendors the upstream edge-confidence change: every GraphEdge carries a `resolution` tag (exact | suffix | fuzzy), now exposed on cartographer.GraphEdge. Cycle detection and the "will create a cycle" prediction ignore fuzzy edges, so false cycles can't rest on a low-confidence stem guess — a safety net for the languages that still resolve heuristically, matching the go.mod backstop already in place for Go. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…endor) Re-vendors the upstream resolver extension: extensionless imports that carry directory structure (Python `from app.services import auth`, monorepo `components/Button`) resolve against the full path — module files and package dirs, preferring __init__.py / index.* entry points — instead of the last stem. Unresolvable qualified imports are external (no edge). Includes the Python extractor fix that preserves import keywords so dotted paths normalize. Cross-package same-name collisions (two `auth.py`) and third-party imports no longer fabricate edges, extending the go.mod precision to Python and pathed TS/JS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Re-vendors the resolver change: JS/TS relative imports (`./bar`, `../models/user`) resolve against the source file's directory (path-precise, `..` walks up, package dirs use index.*); unresolved relatives are dangling refs (no edge). `export … from './x'` re-exports are now captured. Completes the standalone-resolver story alongside Go (go.mod) and Python (qualified dotted paths). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…re-vendor) Re-vendors the change that computes all structural metrics (bridges, cycles, god modules, layer violations, blast radius) on non-fuzzy edges only, so getArchitecture/getBlastRadius/analyzeImpact/prepareChange and the review layers/arch-health checks can't surface a finding built on a fabricated edge. CKB side: review's PR-split clustering (addCartographerEdges) skips fuzzy edges so a split recommendation isn't driven by a low-confidence dependency. No change to CKB's own numbers (Go edges are all exact/suffix); the effect is on polyglot targets CKB analyzes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…llback (re-vendor) Re-vendors the scaling work: parallel edge resolution and parallel betweenness centrality in rebuild_graph (the latter was the dominant serial cost at scale), plus an O(1) directory-suffix fallback (by_dir_last index) replacing the old O(dirs)-per-import scan. Betweenness node order is sorted before sampling so bridge/god-module counts are deterministic. Measured on a 40k-file tree: 56s -> 12.7s (~4.4x); Godot 16s -> ~2s (~8x), same results. CKB uses the parallel FFI path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… (re-vendor) Re-vendor Cartographer with the betweenness rewrite. Centrality was 98% of a graph rebuild; it's now index-based + parallel (bit-identical across core counts) and topology-keyed cached so non-import edits skip the Brandes pass. Godot via the FFI path: full rebuild 3,197ms -> 76ms (~42x), identical output (3182 bridges / 68 god-modules / 0 cycles). The cache is the incremental win for watch/serve sessions and scales with repo size. FFI-tagged query tests green; full -tags cartographer build clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… (re-vendor) Re-vendor Cartographer with directory rollup and the resolution determinism fixes. Rollup folds the file-level graph to directory granularity and runs the full structural analysis on subsystems instead of files — on Godot, 4336 files / 3182 bridges becomes 160 subsystems / 139 bridges with actionable per- subsystem hints. Available via rebuild_graph_rolled_up(depth). Also picks up two determinism fixes (sorted resolver candidates + strongest- resolution edge dedup) that make the graph fully reproducible run-to-run. FFI-tagged query tests green; full -tags cartographer build clean. File-level metrics unchanged (3182 bridges / 60.0 on Godot). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
….0.0 + fixes)
Re-vendor CodeCartographer at 4.0.0 plus the very-large-repo crash fixes. On a
full Linux-kernel checkout (~64k C/H files) the vendored engine aborted the
whole process — including the CKB host via the FFI — through two unbounded
recursions (recursive tree-sitter walkers on deeply nested macro-generated C,
and recursive petgraph tarjan_scc). Parse now runs on a 256 MB-stack pool and
cycle detection uses an iterative Tarjan.
Verified: Health("/tmp/linux") via cgo completes without crashing (new
regression test in internal/cartographer, skips if /tmp/linux absent). FFI
C-ABI unchanged (no bridge changes). FFI-tagged query tests green; full
-tags cartographer build clean. Directly de-risks the very-large-C++-repo case.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Re-vendor the walker depth guard: a hard recursion ceiling (cap 50,000; the
Linux kernel's measured real peak is 3,348) as a belt against adversarial or
machine-generated deep nesting, on top of the 256 MB parse-pool stack. Prevents
a pathological single file from aborting the CKB host via the FFI. Verified:
Health("/tmp/linux") via FFI completes without crashing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a `cartographer` check to `ckb doctor` so a user can confirm the SCIP-free structural fast tier (dependents, blast-radius, rollup) is actually linked into the binary. CGO-free npm/Homebrew builds warn with a `make build` fix; source builds report the linked engine version. Bumps version 9.2.0 → 9.3.0 (version.go, npm, sarif testdata) and cuts the [Unreleased] CHANGELOG section as [9.3.0], covering the large-repo FFI crash fixes, depth guard, 4.0.0 re-vendor, parallel betweenness, directory rollup, and this doctor check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
🟢 Change Impact Analysis
Blast Radius: 0 modules, 0 files, 0 unique callers 📝 Changed Symbols (82)
Recommendations
Generated by CKB |
NFR Tests ✅ 39 unchangedComparing PR against main branch (dynamic baseline). Regressions: 0 ✅ Thresholds: WARN ≥ +5% • FAIL ≥ +10% All scenarios
* = new scenario, compared against static baseline |
CKB Analysis
Risk factors: Large PR with 88 files • High churn: 29725 lines changed • Touches 11 hotspot(s) 👥 Suggested: @lisa.welsch1985@gmail.com (11%), @talantyyr@gmail.com (5%), @lisa@tastehub.io (10%)
🎯 Change Impact Analysis · 🟢 LOW · 82 changed → 0 affected
Symbols changed in this PR:
Recommendations:
💣 Blast radius · 0 symbols · 3 tests · 0 consumersTests that may break:
🔥 Hotspots · 11 volatile files
📦 Modules · 2 at risk
📊 Complexity · 9 violations
💡 Quick wins · 10 suggestions
📚 Stale docs · 197 broken references
Generated by CKB · Run details |
CKB Review: 🟡 WARN — 59/10088 files (+29725 changes) · 19 modules ·
Top Risks
Findings (6 actionable, 24 informational)
✂️ Suggested PR Split (13 clusters)
... and 3 more clusters Code HealthNew files: 1 (avg health: 90) Estimated review: not feasible as a single PR (88 files, 29725 lines, 13 clusters) Reviewers: lisa.welsch1985 (11%) · talantyyr (5%) · lisa (10%) |
The analyzeImpact LIP staleness check read the annotation key `lip:nyx-agent-lock` and reported "an active nyx.code agent". Debrand: key → `lip:agent-lock`, message → "an active agent". The LIP writer side is being updated in lockstep to the same generic key. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Summary
Cuts 9.3.0. Hardens the vendored Cartographer graph engine for very large C/C++ trees, re-vendors it at 4.0.0, parallelizes the hot paths, and adds a
ckb doctorcheck so users can confirm the SCIP-free fast tier is linked.Highlights
tarjan_sccis iterative, and walkers carry a hard depth ceiling (cap 50,000; measured real peak 3,348). Verified with an FFI regression test.ckb doctorcartographer check — reports whether the fast structural tier is linked (CGO-free builds warn with amake buildhint).Testing
-tags cartographerbuild clean; FFI-tagged tests green.getArchitecturereturned a module-level result via the fast tier with no SCIP index, no crash.Version
9.2.0 → 9.3.0(version.go, npm/package.json, sarif testdata, CHANGELOG).🤖 Generated with Claude Code