diff --git a/.gitignore b/.gitignore index 4ed3edc198..db4cbeffb2 100644 --- a/.gitignore +++ b/.gitignore @@ -68,7 +68,8 @@ release/ # Local-only: browser-based tmux session launcher (see tmux-web/README.md) tmux-web/ -assets/__pycache__/ +__pycache__/ +*.pyc assets/generate-waitlist.py diff --git a/AGENTS.md b/AGENTS.md index 55cadb3ec8..86faadb2d0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,15 +4,7 @@ Canonical project guidance for coding agents working in this repository (Codex/A **Instruction budget:** Keep this root file below 32,768 UTF-8 bytes; `npm run check:agent-docs` enforces the limit. Put conditional procedures, evidence, and worked examples in linked documents. Codex user configuration may set `project_doc_max_bytes = 65536` as a safety margin, but the larger limit does not replace the repository guard. -**Completion and branch boundary:** - -- This repository's default integration branch is `fork/consolidated`. -- A worktree or other feature branch is intermediate. -- Before committing or integrating, confirm the checkout is this repository and that its integration target is `fork/consolidated` (worktrees included). Never commit or merge this repository's work into another repository or its default branch (`main` included), and never merge another repository's work here. -- For authorized repository work, finish by committing the verified change, integrating it through any required checks or PR into `fork/consolidated`, pushing, and confirming that its remote head contains the commit. -- Stop earlier only when the user requests it or integration is blocked; report the exact blocker. -- Do not run `npm publish` without explicit authorization. -- Fork GitHub release policy is defined under Releases below. +**Branch:** this repository's default integration branch is `fork/consolidated`; fork work goes there through a pull request to the fork, never to `main`, and focused upstream contributions follow Branch roles below. Do not run `npm publish` without explicit authorization; fork release policy is under Releases below. **Agent rules:** [House Rules](https://github.com/bompus/house-rules) is an optional, portable rule set that works well with this repository; nothing here requires it. If your agent loads it or similar always-on rules, this file adds to them and wins for this repository's commands, branches and checks. diff --git a/assets/__pycache__/generate-waitlist.cpython-313.pyc b/assets/__pycache__/generate-waitlist.cpython-313.pyc deleted file mode 100644 index ffb2bd54a9..0000000000 Binary files a/assets/__pycache__/generate-waitlist.cpython-313.pyc and /dev/null differ diff --git a/docs/benchmarks/explore-requested-evidence.md b/docs/benchmarks/explore-requested-evidence.md index 52df4b8500..3cd0464b39 100644 --- a/docs/benchmarks/explore-requested-evidence.md +++ b/docs/benchmarks/explore-requested-evidence.md @@ -12,7 +12,7 @@ Measured 2026-09-10 (America/Denver). This change fixes omissions of requested s ## Controlled comparison -The 16 queries and expected source ranges come from the private reproduction fixture (private checkout at `74fcd4e`). All 13 referenced source files were checked against their recorded SHA-256 hashes at downstream commit `c570e32b22177ab59d3fa8f4c162419bac196422`. +The 16 queries and expected source ranges come from a private reproduction fixture taken from a downstream application. All 13 referenced source files were checked against the SHA-256 hashes recorded for the pinned downstream revision. Three engines queried the same checkout-local index, with a fresh ToolHandler per query and no explicit `maxFiles` override: @@ -30,15 +30,15 @@ Each cell counts returned / expected nonblank source lines across the fixture's | 2 | Named normalization body | 9/9 | 9/9 | 9/9 | | 3 | Prop wiring and table selectors | 0/24 | 0/24 | 2/24 | | 4 | Cache key and consensus evaluation | 52/123 | 52/123 | 73/123 | -| 5 | Draft identity test | 0/31 | 0/31 | 30/31 | +| 5 | Identity-assertion test | 0/31 | 0/31 | 30/31 | | 6 | Named interface | 0/132 | 0/132 | 132/132 | | 7 | Priority stamping body | 0/33 | 12/33 | 33/33 | -| 8 | ADP mappers and secondary test | 97/117 | 97/117 | 97/117 | -| 9 | TTD receiver/storage, prose query | 0/78 | 0/78 | 0/78 | -| 10 | TTD receiver/storage, event query | 0/78 | 0/78 | 0/78 | +| 8 | Mapper bodies and secondary test | 97/117 | 97/117 | 97/117 | +| 9 | Receiver/storage, prose query | 0/78 | 0/78 | 0/78 | +| 10 | Receiver/storage, event query | 0/78 | 0/78 | 0/78 | | 11 | Hover-related cache key | 0/50 | 0/50 | 0/50 | | 12 | Vue cells and column styles | 0/22 | 0/22 | 18/22 | -| 13 | Draft identity test, broad path control | 0/31 | 0/31 | 23/31 | +| 13 | Identity-assertion test, broad path control | 0/31 | 0/31 | 23/31 | | 14 | Focused stamping control | 33/33 | 33/33 | 33/33 | | 15 | Exact Vue column literal and CSS | 0/4 | 0/4 | 4/4 | | 16 | Explicit sender/receiver/storage bodies | 113/128 | 113/128 | 128/128 | @@ -49,9 +49,9 @@ The decisive assertions are present in cases 1 and 5, including the identity che - Cases 3, 4 and 11 still omit table selectors or the cache key. Case 4's evaluation body is now complete; losing the two formerly returned closing lines of the cache-key range does not establish that the key was previously usable. - Cases 9 and 10 still omit the receiver file unless the query explicitly names its endpoints. Selecting that file and synthesizing the actual message boundary are separate future changes. -- Case 12 returns the survival tag and requested CSS ranges, but still omits the column declaration and ADP/FP cells in that broad query. The exact column-literal control, case 15, is complete. +- Case 12 returns the survival tag and requested CSS ranges, but still omits the column declaration and the remaining column cells in that broad query. The exact column-literal control, case 15, is complete. - Case 13 improves selected test source but still omits the identity assertion. Its broad path-and-function query has less discriminating information than case 5. Do not score it as solved from its filename or partial line count. -- The ADP question remains helpful without the secondary test; no test-inclusion improvement is claimed for case 8. +- The mapper question remains helpful without the secondary test; no test-inclusion improvement is claimed for case 8. ## Validation and reproduction @@ -68,7 +68,7 @@ For a source probe, build the intended engine's TypeScript and copy its assets, ```bash fnm exec --using codegraph node scripts/agent-eval/probe-explore.mjs \ \ - 'src/components/DraftTable.vue "col-w-survival"' + ' ""' ``` Use the fixture's exact queries for the other cases. Match numbered lines inside each file's fenced Source section, not occurrences in the blast-radius header or omitted-symbol pointers. Recheck fixture hashes first. The direct harness binds the project through `CodeGraph.openSync`; it is not a deployed MCP or agent A/B run. diff --git a/docs/benchmarks/explore-selector-cache-evidence.md b/docs/benchmarks/explore-selector-cache-evidence.md index 98a5ff3398..5858f9c93a 100644 --- a/docs/benchmarks/explore-selector-cache-evidence.md +++ b/docs/benchmarks/explore-selector-cache-evidence.md @@ -12,17 +12,17 @@ The existing guards for stale source, file admission, oversized containers, flow ## Fixed-source comparison -The exact 16 queries and 13 source-file hashes are from the private fixture (private checkout at `74fcd4e`), pinned to downstream source `c570e32b22177ab59d3fa8f4c162419bac196422`. Both engines used the same existing index and a fresh ToolHandler per call. Baseline results are the retained `22ae167837e174fa623dc77c2c4435ecadbc37d0` comparison; candidate results were rerun with each referenced source hash checked. This compares source completeness, not agent answer quality or independently rebuilt indexes. +The exact 16 queries and 13 source-file hashes are from the private fixture described in the first report, pinned to a downstream application's source revision. Both engines used the same existing index and a fresh ToolHandler per call. Baseline results are the retained `22ae167837e174fa623dc77c2c4435ecadbc37d0` comparison; candidate results were rerun with each referenced source hash checked. This compares source completeness, not agent answer quality or independently rebuilt indexes. | Case | Evidence | 22ae1678 | Candidate | | --- | --- | --- | --- | | 3 | Popout prop wiring | 2/2 | 2/2 | -| 3 | DraftTable selectors | 0/22 | 22/22 | +| 3 | Table selectors | 0/22 | 22/22 | | 4 | Cache key | 0/50 | 50/50 | | 4 | Consensus evaluator | 73/73 | 73/73 | | 11 | Cache key from broad hover/invalidation query | 0/50 | 50/50 | -All other fixture ranges retain their baseline completeness. The snapshot assertion, draft identity assertion, named interface, stamping body, ADP mapper bodies, exact Vue column/CSS, and explicit TTD endpoint bodies remain passing controls. Cases 9/10 still omit the broad-query receiver; case 12 still omits the column declaration and ADP/FP cells; case 13 still omits the identity assertion. No sender-to-listener edge was added. +All other fixture ranges retain their baseline completeness. The snapshot assertion, identity assertion, named interface, stamping body, mapper bodies, exact Vue column/CSS, and explicit endpoint bodies remain passing controls. Cases 9/10 still omit the broad-query receiver; case 12 still omits the column declaration and the remaining column cells; case 13 still omits the identity assertion. No sender-to-listener edge was added. The candidate's maximum response was 24,989 characters; all 16 responses totalled 392,850 characters. Single-pass median latency was 197.5 ms, range 69–268 ms. The earlier baseline was 202 ms, range 65–258 ms. Runs were not interleaved: these timings do not establish a speedup or regression. diff --git a/docs/benchmarks/fork-vs-upstream-2026-09-26.md b/docs/benchmarks/fork-vs-upstream-2026-09-26.md index 637b407528..3b69057872 100644 --- a/docs/benchmarks/fork-vs-upstream-2026-09-26.md +++ b/docs/benchmarks/fork-vs-upstream-2026-09-26.md @@ -13,9 +13,8 @@ n8n (Vue and TypeScript) and re-measures every corpus on one newer fork build. in their own worktrees. - **Host.** WSL2 Ubuntu, 16 vCPUs, 47 GiB RAM, ext4. No swap in use. Each batch started with a 1-minute load average under 2 and Windows under 5% CPU. -- **Commands.** Every run was capped with - `nice -n 10 ~/.local/bin/run-capped 16G` and timed with `/usr/bin/time -v`, - with `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_NO_DAEMON=1` and +- **Commands.** Every run used `nice -n 10` under a 16 GiB memory cap and was + timed with `/usr/bin/time -v`, with `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_NO_DAEMON=1` and `CODEGRAPH_TELEMETRY=0`. The index directory started empty for every run. - Index: `codegraph init --yes .` - One-file sync: an untimed `init`, then a one-line edit to one source file, @@ -98,7 +97,7 @@ README lists as the fork's largest. ## One-file sync: fork vs upstream (Node 24) -Re-measured later the same day on an idle host (no other session's capped jobs +Re-measured later the same day on an idle host (no other session's memory-capped jobs running, 1-minute load 1.5–4 from the benchmark's own workers), with the fork at `perf/incremental-sync` (the sync skip cache, [`docs/design/incremental-synthesis.md`](../design/incremental-synthesis.md)). Each arm indexes once, then times two one-file syncs, each adding a line to the diff --git a/docs/benchmarks/fork-vs-upstream-2026-09-28.md b/docs/benchmarks/fork-vs-upstream-2026-09-28.md index c27e89bd81..2b87e27eec 100644 --- a/docs/benchmarks/fork-vs-upstream-2026-09-28.md +++ b/docs/benchmarks/fork-vs-upstream-2026-09-28.md @@ -19,10 +19,10 @@ runtime comparison (Node 24, Node 26, Bun), which was not re-run. `npm run build` in their own worktrees. - **Host.** WSL2 Ubuntu, 16 vCPUs, 47 GiB RAM, ext4, Node 24.21.0. No swap in use. Before each corpus's index step and again before its sync step, the - runner waited until no other session held a capped job and the 1-minute load - average was under 2. -- **Commands.** Every run was capped with `nice -n 10 ~/.local/bin/run-capped` - (16G for index, 13G for sync) and timed with `/usr/bin/time -v`, with + runner waited until no other session's memory-capped job was running and the + 1-minute load average was under 2. +- **Commands.** Every run used `nice -n 10` under a memory cap (16 GiB for + index, 13 GiB for sync) and was timed with `/usr/bin/time -v`, with `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_NO_DAEMON=1` and `CODEGRAPH_TELEMETRY=0`. The index directory started empty for every run. - Index: `codegraph init --yes .` diff --git a/docs/benchmarks/fork-vs-upstream-node-bun-2026-09-28.md b/docs/benchmarks/fork-vs-upstream-node-bun-2026-09-28.md index bdf4926d2a..543331746b 100644 --- a/docs/benchmarks/fork-vs-upstream-node-bun-2026-09-28.md +++ b/docs/benchmarks/fork-vs-upstream-node-bun-2026-09-28.md @@ -36,11 +36,11 @@ The scripts are in [`scripts/benchmarks/runtime/`](../../scripts/benchmarks/runt fork needs no override. - **Host.** WSL2 Ubuntu, 16 vCPUs, 47 GiB RAM, ext4. Swap was cycled before the run and stayed at 0 B. Before each corpus the runner waited until no - other session held a capped job and the 1-minute load average was under 2. - Windows-side CPU was about 9%. + other session's memory-capped job was running and the 1-minute load average + was under 2. Windows-side CPU was about 9%. - **Environment.** `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_TELEMETRY=0`, and `CODEGRAPH_NO_DAEMON=1` for the CLI runs. Every CLI run used - `nice -n 10 ~/.local/bin/run-capped 16G` and `/usr/bin/time -v`. Peak memory + `nice -n 10` under a 16 GiB memory cap and `/usr/bin/time -v`. Peak memory is MaxRSS. Database size is `codegraph.db` after a WAL checkpoint. - **Order.** Per corpus the arms ran in the order upstream Node, fork Node, fork Bun, upstream Bun, then the reverse. Each run did a full index diff --git a/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-03.md b/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-03.md index d3d03aec01..3685020c75 100644 --- a/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-03.md +++ b/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-03.md @@ -28,12 +28,12 @@ The scripts are in [`scripts/benchmarks/runtime/`](../../scripts/benchmarks/runt Node 25 and newer, so without the override upstream exits with `Unsupported Node.js version: 26.3.0`. The fork needs no override. - **Host.** WSL2 Ubuntu, 16 vCPUs, 47 GiB RAM, ext4. Before each corpus the - runner waited until no other session held a capped job and the 1-minute - load average was under 2. Unlike the 2026-09-28 run, swap was not cycled + runner waited until no other session's memory-capped job was running and the + 1-minute load average was under 2. Unlike the 2026-09-28 run, swap was not cycled first: 2.1 GiB of swap was in use, with about 35 GiB of memory available. - **Environment.** `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_TELEMETRY=0`, and `CODEGRAPH_NO_DAEMON=1` for the CLI runs. Every CLI run used - `nice -n 10 ~/.local/bin/run-capped 16G` and `/usr/bin/time -v`. Peak memory + `nice -n 10` under a 16 GiB memory cap and `/usr/bin/time -v`. Peak memory is MaxRSS. Database size is `codegraph.db` after a WAL checkpoint. - **Order.** Per corpus the arms ran in the order upstream Node, fork Node, fork Bun, upstream Bun, then the reverse. Each run did a full index diff --git a/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-12.md b/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-12.md index c84c5e0bd7..1cd42ecc18 100644 --- a/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-12.md +++ b/docs/benchmarks/fork-vs-upstream-node-bun-2026-10-12.md @@ -31,13 +31,12 @@ The scripts are in [`scripts/benchmarks/runtime/`](../../scripts/benchmarks/runt `Unsupported Node.js version`. The fork needs no override. The previous run used Bun 1.4.2. - **Host.** WSL2 Ubuntu, 16 vCPUs, 62 GiB RAM, ext4. Each run waited until - the host was quiet (below), and the benchmark held the host lock while it - ran. + the host was quiet (below), and the benchmark held a lock that other sessions + on the host respect before starting heavy jobs. - **Environment.** `CODEGRAPH_DIR=.cg-bench`, `CODEGRAPH_TELEMETRY=0`, and `CODEGRAPH_NO_DAEMON=1` for the CLI runs. Every timed command ran at normal - priority under `~/.local/bin/run-capped 16G` (a 16 GiB memory cap) and - `/usr/bin/time -v`. Peak memory is MaxRSS. Database size is `codegraph.db` - after a WAL checkpoint. + priority under a 16 GiB memory cap and `/usr/bin/time -v`. Peak memory is + MaxRSS. Database size is `codegraph.db` after a WAL checkpoint. - **Order.** Per corpus the arms ran in the order upstream Node, fork Node, fork Bun, upstream Bun, then the reverse. Each run did a full index (`codegraph init --yes .` into an empty directory) and then two one-file @@ -60,10 +59,10 @@ corpus. ### Quiet-host rule A run started only when swap in use was at most 64 MiB, the 1-minute load -average was under 2, no `capped-*` scope was running, and Windows CPU, read from -the Windows side, was under 20% for three samples 20 s apart. An attempt was -rejected as suspect when the command exited non-zero or a Windows CPU sample -before or after it exceeded 30%. Each corpus had one retry; the first accepted +average was under 2 and no memory-capped job (a `capped-*` systemd user scope) +was running. Windows CPU, read from the Windows side, also had to be under 20% for three +samples 20 s apart. An attempt was rejected as suspect when the command exited non-zero or +a Windows CPU sample before or after it exceeded 30%. Each corpus had one retry; the first accepted attempt is the one reported. The two runs per arm are the spread this page offers; no wider variation criterion was set before the run, so a difference near the 3% reporting band is labelled no clear change. diff --git a/docs/design/strategy-2026-09.md b/docs/design/strategy-2026-09.md index 48fc8bd155..fa9940229e 100644 --- a/docs/design/strategy-2026-09.md +++ b/docs/design/strategy-2026-09.md @@ -6,13 +6,13 @@ ## 1. What we need from a code index -Our use comes first; "best all-around" is the second test. From our private downstream project's code-index research and the fork's own history: +Our use comes first; "best all-around" is the second test. From code-index research done for a downstream application and the fork's own history: -- **Agent-driven work on a shared host.** Many sessions across Claude Code, Codex, Cursor, OpenCode, AGY and Devin, most of them in their own git worktrees, on one WSL machine that has been OOM-killed by aggregate memory pressure. +- **Agent-driven work on a shared machine.** Many sessions across Claude Code, Codex, Cursor, OpenCode, AGY and Devin, most of them in their own git worktrees, share one machine, so aggregate memory pressure is a real constraint. - **One call that answers.** The measured win is an agent that stops reading files because the answer came back complete: verbatim, line-numbered source plus the flow between the named symbols. In the rules-on A/B (Opus, headless, 6 discovery + 3 concept tasks) CodeGraph cut 2 to 2.5 calls per task and kept 6 of 6 correct. Two shapes that return less than source measured worse: a symbols-only answer lost 2 of 18 cells, and gortex's budgeted outline answered 3 of 6. - **The index has to be right.** A wrong caller or a wrong edge is what sends the agent back to Grep; a missing one mostly costs a follow-up call. - **Local, deterministic, no LLM in the index.** Answers must be reproducible, and nothing leaves the machine. -- **Fresh in every checkout.** Worktrees had no index in 9 of 11 cases in the downstream audit; an un-indexed root routes the agent to Grep. +- **Fresh in every checkout.** Worktrees had no index in 9 of 11 cases in an audit of a downstream setup; an un-indexed root routes the agent to Grep. - **Also used:** string literals and storage keys (the `literals` table), Markdown sections, and transcript search across hosts (`codegraph_sessions`). What we do not need, on current evidence: embeddings, LLM-written documentation, large tool catalogues, compact wire formats, PreToolUse hooks. Each was measured null or negative, or has no use here (see the survey's rows L–R). @@ -49,7 +49,7 @@ repowise's [BENCHMARKS.md](https://github.com/repowise-dev/repowise/blob/main/do | Graph build, 35 repositories | 3.65 s median, **757 MB** peak, fastest on 16 | 2.77 s, **75 MB**, fastest on 14 | speed level, memory 10× theirs | | Full index, django | **16.4 s** | 367 s (1,058 s with prose) | our clearest win | -The TypeScript result matters most to us: TypeScript is our downstream project's language and the language of most of the README corpora. +The TypeScript result matters most to us: TypeScript is the language of the downstream application this fork serves and of most of the README corpora. The precision gap has a likely shape. repowise types a receiver from its declaration where it can, and stores every weaker binding under a named origin with a lower confidence (its cross-file "global unique" match is recorded at 0.50 as a guess); CodeGraph's exact-name and fuzzy strategies bind a call to a same-named definition that passes the gates, with nothing marking it as a guess. The fork already found one instance while writing this: the kernel bound a Python call to a same-named Nix binding, which the TypeScript resolver rejects (fix pending). The 1.5.0 numbers predate the fork's binding model (#27–#38) and the member-access kernel work, so some of the 116 wrong rows may already be fixed. That has to be measured, not assumed (§6, step 1). @@ -66,7 +66,7 @@ What it bought, all measured in the ledger (§5.38–5.43): What it did not buy: - **Answer quality or precision.** The kernel resolver is a bug-for-bug mirror of the TypeScript one, so it reproduces the 58.6%. The survey's conclusion still holds: "The language of the engine did not decide any of these outcomes; what the tool returns did." -- **Memory.** Our index run peaks near 400 MB even on a repository of 1,200–1,500 nodes (os-lib, lazy.nvim in the ledger's A/B), so the floor is Node plus the worker pool, not the kernel. repowise builds its graph in 75 MB. On a host that has been OOM-killed by aggregate pressure, this matters more to us than seconds do. +- **Memory.** Our index run peaks near 400 MB even on a repository of 1,200–1,500 nodes (os-lib, lazy.nvim in the ledger's A/B), so the floor is Node plus the worker pool, not the kernel. repowise builds its graph in 75 MB. On a machine shared by many agent sessions, memory matters more than seconds do. - **One implementation (as of 2026-09-25; #192 has since removed the TypeScript resolver spine).** Every kernel punt then ran the TypeScript resolver, so there were two resolvers to keep in step, and a parity bug the dump gate could not see (a language no corpus contains) could ship silently. `import-resolver.ts` remains as an import-path helper for synthesizers and framework resolvers. The greenfield sketch's reopen conditions are close to met: both incremental plans have landed and resolution runs in the kernel with golden-dump parity. Its third condition, "a memory ceiling the daemon cannot meet", now has outside evidence behind it. That argues for measuring the memory floor before deciding anything larger, not for a rewrite. @@ -98,7 +98,7 @@ Take option B: 2. **Keep an upstream channel for small fixes only.** Of the fork's 205 non-merge first-parent commits since the merge-base, about 67 are independent TypeScript fixes or features, and 25 of those cherry-pick onto `upstream/main` without conflict. Send those as goodwill in the shape the maintainer actually merges: one concern, under ~600 lines, a fail-to-pass test, no CHANGELOG hunk. Do not wait on them; nothing in our plan depends on them landing. 3. **Close or re-cut the stalled large PRs** (#1699, #1867, #1737, #1702, #1841) so they stop costing rebases. -This also changes the downstream project's stated goal of keeping the fork thin so that retiring it stays a one-line swap. That goal assumed upstream would absorb our work; the numbers above say it will not. The downstream kernel entry should name the fork as the served engine on purpose, not as a temporary divergence. +This also changes a downstream consumer's stated goal of keeping the fork thin so that retiring it stays a one-line swap. That goal assumed upstream would absorb our work; the numbers above say it will not. The consumer's kernel entry should name the fork as the served engine on purpose, not as a temporary divergence. ## 6. Priorities for the engine @@ -109,7 +109,7 @@ Ordered by what moves "the agent stops reading" and by what the outside benchmar - Tighten the strategies that bind by name alone (exact-name across files, fuzzy) where the precision replay shows them wrong, starting with TypeScript: decline when the receiver's type is unknown rather than pick a same-named method. - Persist a resolution origin with a confidence on every edge, like repowise's 29 origins or gortex's tiers, and show it in explore's flow so the agent verifies the uncertain hop instead of re-reading the neighbourhood. Add the cross-language mis-wire guard with it (survey item C; the Nix bug is this class). Gate: the precision replay improves, the golden dumps change only where intended, and the agent A/B shows no recall loss that costs answers. -3. **Measure and cut the memory floor.** Profile a small-repo index and the idle daemon: Node heap, per-worker node tables and caches, SQLite page cache. Set a target (for example, under 200 MB for a small repository) before optimizing. This is the one cost where we measured 10× worse than a competitor, and it is the one our host actually suffers from. **Done 2026-09-25:** metrics ledger §5.45 (parse pool sized to the project, idle query workers retired; a 3-file project's index run peaked at 176 MB, down from 358 MB). +3. **Measure and cut the memory floor.** Profile a small-repo index and the idle daemon: Node heap, per-worker node tables and caches, SQLite page cache. Set a target (for example, under 200 MB for a small repository) before optimizing. This is the one cost where we measured 10× worse than a competitor, and it is the one a shared machine feels first. **Done 2026-09-25:** metrics ledger §5.45 (parse pool sized to the project, idle query workers retired; a 3-file project's index run peaked at 176 MB, down from 358 MB). 4. **Diff-seeded impact in explore** (survey item A). Every review-oriented competitor ships it; we have the impact machinery and no entry point. Add a "what does this diff break" task class to the agent-eval harness first. **Done 2026-09-25:** explore answers change questions from the diff (#125); the diff-impact task class and its first baseline in the agent-eval harness followed in #460. 5. **Index artifacts for worktrees** (survey item D). Copy an index into a new worktree and catch up by file hash, so a fresh worktree answers from the first call. **Done 2026-09-26:** `codegraph init` seeds from the closest compatible sibling worktree index and syncs (ledger 5.58). 6. **Finish the resolver port, then delete the TypeScript resolver.** Only after steps 1–2, so the kernel moves one design forward instead of two mirrors in step. This removes the dual-maintenance cost for good. **Done 2026-09-26:** the TypeScript resolver spine is deleted; the kernel resolver is the only one (#192). This went ahead of the "only after steps 1–2" order: step 1 was done, and step 2 is still open. @@ -126,6 +126,6 @@ Explicitly deferred: git-history and code-health layers (repowise's strengths, b - CodeGraph upstream releases: https://github.com/colbymchenry/codegraph/releases - codebase-memory-mcp: https://github.com/DeusData/codebase-memory-mcp - Upstream PR and merge statistics: `gh pr list -R colbymchenry/codegraph --state all --limit 200`, 90 days to 2026-09-25; divergence from `git diff --shortstat upstream/main...origin/fork/consolidated` at merge-base `ba3c21e5`. -- Our own measurements: [metrics-ledger.md](metrics-ledger.md) §5.38–5.43; the rules-on A/B in the downstream project's code-index research. +- Our own measurements: [metrics-ledger.md](metrics-ledger.md) §5.38–5.43; the rules-on A/B in a downstream application's code-index research (not published). Limits: competitor facts are from their own documentation except where repowise measured them; the precision and retrieval figures are for CodeGraph 1.5.0, not this fork; the 67 / 25 upstream-able counts come from a path-and-subject classification and a patch-level apply check, with no build or tests run. diff --git a/scripts/precision/__pycache__/pick-g1-commit.cpython-314.pyc b/scripts/precision/__pycache__/pick-g1-commit.cpython-314.pyc deleted file mode 100644 index 2d1c092879..0000000000 Binary files a/scripts/precision/__pycache__/pick-g1-commit.cpython-314.pyc and /dev/null differ diff --git a/scripts/precision/__pycache__/replay-repowise-g1.cpython-314.pyc b/scripts/precision/__pycache__/replay-repowise-g1.cpython-314.pyc deleted file mode 100644 index b742248dc0..0000000000 Binary files a/scripts/precision/__pycache__/replay-repowise-g1.cpython-314.pyc and /dev/null differ