Skip to content

SigMap 8.85.0

Choose a tag to compare

@github-actions github-actions released this 28 Oct 00:42
· 5 commits to main since this release
ff6c504

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 bin or main that is generated is left out of the index, and explain says why (#876) — a project that ships a bundle as its bin had that file pulled in as a declared entrypoint although srcDirs never reached it; on this repository that was the 42,000-line gen-context.js, so every src/ 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 with Generated, @generated or auto-generated, says DO NOT EDIT, or names a generated bundle; a bundler's or compiler's own runtime helpers at the top; and a trailing sourceMappingURL. 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 bare generated must open a sentence). sigmap explain prints EXCLUDED: generated entrypoint declared in package.json (<reason>), the MCP explain_file says "looks generated", and a declared hand-written entrypoint outside srcDirs is no longer called "not under any srcDir" while being indexed. Against an untouched develop: hard, mined, easy, jvm and 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_bytes of an AGENTS.md (32 KiB by default) and cuts the rest without a word; Claude Code asks for a short CLAUDE.md. The outputs wrote the whole map (43 KB on gin, 887 lines). src/util/host-limits.js names each limit and where it comes from (Codex's own config.toml, CODEX_HOME honoured, else 32 KiB; 200 lines for Claude Code); the new codexMaxBytes and claudeMaxLines config keys override either and 0 turns 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 doctor gains an "Instruction files" row: each file's size against its limit and what the host does with the rest. AGENTS.md leaves the package files (no host reads a package's own AGENTS.md inside node_modules). The MCP default is documented and not changed: a plain sigmap mcp install claude writes nothing into the repository and so advertises all 22 tools; sigmap --init writes 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 () {} and export 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, and explain shows 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 (typescript is 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 by generate (with the roots, and a warning naming the largest directories left out under 80%), validate and its --json, doctor (the config row turns to a warning) and roots (with each root's file count and how many scored candidates the cap left out). src/analysis/coverage-score.js gains repositoryCoverage and formatRepositoryCoverage.
  • src/util/statement-start.js (#996) — atStatementStart(text, index) answers "does export begin 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 took examples, libuv docs, exposed documentation-website, and a JS monorepo collapsed to packages/). 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 develop reproduces this release's. In the 21-repository matrix express, axios, vue-core and svelte list 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 corpus express goes 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 generated gen-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. hard reads 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 export begin 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. atStatementStart looks 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:241 has 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).