Repository navigation
SigMap 8.85.0
Minor. The index no longer carries a generated bundle, a first run on a deep layout covers the code of the repository, the TypeScript and JavaScript extractors read four shapes they dropped, and the codex and claude outputs fit what the host reads (#876, #997, #996, #995). This is R2 of the plan in the issue list, tracked as #1038; it changes shipped code in src/extractors/, src/discovery/, src/analysis/, src/doctor/, src/mcp/, packages/adapters/ and the bundle; the npm package goes from 225 to 227 files (three new modules in src/util/, and AGENTS.md leaves). The third-party corpus moves 115 → 118 of 208 (55.3% → 56.7%) because detection now reaches the Rails gems it used to leave out.
Added
- A declared
binormainthat is generated is left out of the index, andexplainsays why (#876) — a project that ships a bundle as its bin had that file pulled in as a declared entrypoint althoughsrcDirsnever reached it; on this repository that was the 42,000-linegen-context.js, so everysrc/function was listed twice and the changes and todos sections reported the bundle's copies.generatedReason(src/util/file-class.js) reads four independent signals, none a size guess: a build-output directory or a.generated./.pb.name; a header comment that opens withGenerated,@generatedorauto-generated, saysDO NOT EDIT, or names a generated bundle; a bundler's or compiler's own runtime helpers at the top; and a trailingsourceMappingURL. Over the 8,596 JavaScript and TypeScript files of the 54 pinned clones it flags 34, all generated once a first header rule that flagged a hand-written JSDoc line was tightened (a baregeneratedmust open a sentence).sigmap explainprintsEXCLUDED: generated entrypoint declared in package.json (<reason>), the MCPexplain_filesays "looks generated", and a declared hand-written entrypoint outsidesrcDirsis no longer called "not under any srcDir" while being indexed. Against an untoucheddevelop:hard,mined,easy,jvmand the third-party corpus unchanged, no hit status flips; this repository's own run reads 213 files instead of 214 and its token reduction reads 96%, not 98%, because the denominator shrank. - The codex and claude outputs are sized to what the host reads (#995 items 1 to 3) — Codex loads at most
project_doc_max_bytesof anAGENTS.md(32 KiB by default) and cuts the rest without a word; Claude Code asks for a shortCLAUDE.md. The outputs wrote the whole map (43 KB on gin, 887 lines).src/util/host-limits.jsnames each limit and where it comes from (Codex's ownconfig.toml,CODEX_HOMEhonoured, else 32 KiB; 200 lines for Claude Code); the newcodexMaxBytesandclaudeMaxLinesconfig keys override either and0turns a cap off. The file is measured as it will be written, the lines a person wrote above SigMap's block included, and the same entries are re-sized with the existing token budget until it fits, lowest priority first, with a line saying how many files were left out; a limit the human lines already exceed is said and the block shrinks to its fixed header.sigmap doctorgains an "Instruction files" row: each file's size against its limit and what the host does with the rest.AGENTS.mdleaves the packagefiles(no host reads a package's ownAGENTS.mdinsidenode_modules). The MCP default is documented and not changed: a plainsigmap mcp install claudewrites nothing into the repository and so advertises all 22 tools;sigmap --initwrites the 7-tool core profile; a test installs into a fresh repository, starts the server it registered and pins the count against the docs. - The TypeScript and JavaScript extractors read four shapes they dropped, and say what an unread file held (#996) — in zod 33% of the top-level exports carry a
$. Read now: a$in a name (const, function, interface, type, class); generic arrows and arrows behind a type annotation that itself contains=>;export const x = make(...)as a const entry with its name and anchor;export default function () {}andexport default (a) =>; and CommonJS assignment methods (app.use = function use(fn),exports.x,module.exports.x) on the module's exported object. A class-body scan that took the=of a generic default (class ZodError<T = any>) for an assignment and gave up is fixed. The shapes read since this change are listed after the ones always read (src/util/late-last.js), so nothing previously listed can be pushed past the 200-signature cap and a file with none of the new shapes is byte-identical; over the 8,610 JavaScript and TypeScript files of the pinned clones and this repository, 335 files gain 1,377 signatures and no signature that was listed before is missing. A run prints how many files declare exports and list none, andexplainshows the export lines it saw and says the gap is the extractor's, not the configuration's. - TypeScript joins the extraction-recall harness (#996) — measured against the compiler's own parse (
typescriptis not a dependency:--typescript,SIGMAP_TYPESCRIPT, or a package that resolves; otherwise unmeasured, and no floors, as for C and C++). 326 files of zod, vue-core, excalidraw and vitepress, extractor population, before → after: function 87.0 → 87.2%, class 40.8 → 49.3%, interface 48.4 → 75.0%, type 61.4 → 76.7%, arrow 74.3 → 89.4%, factory 0 → 38.6%, anonymous default 0 → 100%,$names 0 → 57.8%. What is still missing is mostly the cap: 216 of 223 factory misses and 211 of 218$misses are in four zod files that hold 283 to 768 entries each. The shipped index holds 284 of the 326 files where it held 227. - One sentence says how much of the repository the roots cover (#997) —
N% of the repository's code (X of Y files) is under the source roots, printed identically bygenerate(with the roots, and a warning naming the largest directories left out under 80%),validateand its--json,doctor(the config row turns to a warning) androots(with each root's file count and how many scored candidates the cap left out).src/analysis/coverage-score.jsgainsrepositoryCoverageandformatRepositoryCoverage. src/util/statement-start.js(#996) —atStatementStart(text, index)answers "doesexportbegin a statement" with one short look-back from each match.
Changed
- Detection counts a directory's code through its whole tree and takes roots until they hold the code (#997) — it counted two levels deep and kept six roots, so a layout that keeps its code deeper (Rails:
<gem>/lib/<gem>/…, three levels down) scored 0 for most directories, and a first run indexed 42% of the code (659 of 1,578 files in the pinned clone) while the summary read "Indexed 100%". Candidates are now counted to eight levels, roots are ordered by the code they hold, and past six roots the next-ranked candidates are added until the roots hold 95% of the candidates' code, at most 40. A name-penalised directory (docs,examples,tests,documentation-*), a dot directory and a candidate that holds other candidates keep the old two-level count: the deeper count lifted each of them into the roots on a first version (flask tookexamples, libuvdocs, exposeddocumentation-website, and a JS monorepo collapsed topackages/). Source-root gate, files under the roots of files present: rails 659 → 1,509 of 1,578 (41.8% → 95.6%), kotlinx-coroutines 42 → 383 of 401, akka 947 → 1,170 of 1,240, upickle 31 → 91, shiny 180 → 293, dio 74 → 100, excalidraw 501 → 518, sidekiq 105 → 113, rust-analyzer 1,343 → 1,387, okhttp 290 → 296, clap 120 → 124; tokio 481 → 478 and zod 218 → 217 (the sixth root is a different directory). A repository the old cap truncated now indexes more files, which is a product change and not only a fix. - The third-party baseline is re-recorded, 115 → 118 of 208 (55.3% → 56.7%) (#997, #996) — Rails x084 and x087 become hits (its four unreachable answers: none now) and zod x202 a hit; no hit is lost; unreachable answers 13 → 8. The source-root baseline is edited for the 11 entries the change moved, and the signal-arm report's third-party column is re-scored (
--only xrepo); the README, the compare page and the retrieval guide follow. - Published figures move, all caused by the extractors and detection and none by the release text — a control at the v8.84.0 tag reproduces its saved reports leaf for leaf, and an untouched merged
developreproduces this release's. In the 21-repository matrixexpress,axios,vue-coreandsveltelist more (the shapes the TypeScript and JavaScript extractors now read): the maps hold 2,081 more tokens (280,959 → 283,040), so token reduction reads 95.4% → 95.2%. In the 18-repository retrieval corpusexpressgoes MRR 0.781 → 0.938 (two tasks move from rank 2 and rank 4 to rank 1) while hit@5 stays 80.4%, which moves the task-success proxy 60.0% → 61.9% (63 → 65 of 105 correct) and prompt reduction 43.7% → 44.4% (1.6 → 1.58 prompts a task). The honest comparison reads 92.0% → 92.8% (115 → 116 of 125, the hard split 11 → 12 of 15; the grep baseline stays 39.2%, so the lift is 2.35× → 2.37×; one self-repo task, whose answer is the generatedgen-context.js, goes from ranked 151st to not indexed, which is #876 working as designed). Grounded symbols 17,823 → 17,979. Test-discovery F1 (98.0%), the grounding corpus and the hallucination guard reproduce v8.84.0 leaf for leaf.hardreads 63 of 90 (70.0%) against a floor of 68.0%, one task of headroom.
Fixed
- A stall on Node 22 in the new extractor, found by CI before release (#996) — the first version asked "does
exportbegin a statement" with a variable-length lookbehind in ten regexes. V8 up to Node 22 walks back over the whole run of blanks behind each position, and a string literal is masked to blanks before the scan: excalidraw's 790 KB base64 wasm module took minutes, and the third-party job's warm-cache step timed out after 45 minutes. Node 25 optimises the lookbehind away, which is why a laptop never showed it.atStatementStartlooks back from each match instead: on Node 22, 200,000 blanks take 35 ms where they took 171 s. A test pins that neither extractor contains a lookbehind, so a fast Node cannot hide the mechanism.
Notes
- #995 item 4 is not done (the default content waits for the agent-level A/B, #974), and the C/C++ 200-signature cap question is left out.
- The 200-signature cap now cuts entries of the new shapes in four zod files (the 54 older entries are never cut: the new shapes are listed last).
src/extractors/ruby.js:241has a variable-length lookbehind of the same kind ((?<!\bdef\s+)), older than this release and not tested on Node 22.- The commits for #876, #996 and #997 carry a closing keyword, so those three issues close when this release reaches
main; #995 stays open (item 4).