Skip to content

v1.108.297 — The counter that never moved

Choose a tag to compare

@jgravelle jgravelle released this 25 Aug 13:45
· 103 commits to main since this release

PARSER_GENERATION 1 → 2.

That counter decides whether an index's symbols are trusted. It was pinned to 1 on 2026-08-05 and never moved — while ten commits touched the parser, four of which change which symbols exist:

commit effect
.246 class field initializer no longer donates members to its class changes membership and ids
.254 Python package-relative imports built no graph edge changes the graph
.267 Kotlin and Bash constants are extracted adds symbols
#428 Rust, Go, Java and PHP constants are extracted adds symbols

Each is exactly the case the counter exists for: the file content is unchanged, so the incremental path never re-reads it and the new symbols never appear. If you index Rust, Go, Java, PHP, Kotlin or Bash, your existing index is missing constants it would now extract. This release repairs it on the next index_folder / index_repo.

Why a bump and not a smarter trigger

The half with no other remedy is the indexes already stamped 1. A stamp equal to the constant is indistinguishable from a current one, so those were permanently exempt from repair — measured on one machine, 8 of 13 such indexes predated parser changes they were missing.

Re-running the upgrade more often cannot reach them. It would repair the visibly-stale ones, stamp them current, and move them into the bucket nothing can reach.

Effect size, stated so nobody oversells it

The raw census (100 of 113 local indexes at the old generation, 178,013 symbols) reads as mass corruption. It is not. Measured on NestJS at a pinned commit with a clean tree, so the parser was the only variable: 0.5% id churn — 58 gone, 61 new, 10,652 identical. The sampled churn sits in a file with zero non-ASCII bytes, so it is not the #414 defect the counter was created for; it is ordinary parser evolution.

Cite the drift mechanism, not the census.

Cost

One full re-parse per index, once. NestJS alone was 46.7 s. jcodemunch-mcp refresh is the paced, resumable vehicle if you have many.

The mechanism is still manual, deliberately

This counter is a manual assertion about an automated thing, so it drifts silently. Deriving it from the extractor sources and the tree-sitter grammar versions is now specced and ships in the sdist at docs/prd-extraction-fingerprint.md — including two inputs a naive version would miss: tree-sitter-language-pack is an unpinned range, so the grammar moves with no code change; and the shared parse cache keys on INDEX_VERSION, which moves for storage-schema reasons.

Until that exists, any parser change altering which symbols exist must bump the line in the same commit.


Also drops a CLAUDE.md citation to a PRD that has never existed on disk or in git history.

Tests: 8315 passed, 17 skipped, 0 failed on Python 3.12 and 3.13 — same 8332 total, same skip split. ruff check src/ clean.

Install: pip install jcodemunch-mcp==1.108.297