NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #2389 by repository stars
Last release today
20 Sep 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 months old
797 releases · first in 2026
One column per month.
Build-time PGO. Ships a default profile (pgo/default.pgo) and a repdriver tool; the parity_report build compiles with it. About 7% wall-clock reductio
pgo/default.pgo) and a repdriver
tool; the parity_report build compiles with it. About 7% wall-clock
reduction, byte-identical across all 206 grammars.runtime.duffcopy calls per compare. About 14%
wall-clock reduction on the forest-path grammars, byte-identical.-All quantifier matchers now charge a
per-execution work budget, bounding worst-case combinatorial blow-up on
adversarial query/source pairs. Exposed via Cursor.DidExceedMatchLimit and
configurable with SetMatchWorkBudget (default 1,000,000).ERROR nodes on common edits such as deleting the whitespace between two
identifiers (e.g. Clojure (a b) → (ab)). Verified byte-identical to a
fresh parse across the C-oracle incremental parity harness.2c702656 parser receipt as the v0.39.0
production-code baseline rather than implying that its revision is current
main after the documentation-only release commits.Correctness-and-evidence release. Query ranges, literals, missing-node patterns, property metadata, highlight inheritance, lazy tree finalization, DFA
Correctness-and-evidence release. Query ranges, literals, missing-node patterns,
property metadata, highlight inheritance, lazy tree finalization, DFA EOF
seeking, grammar imports, and generated C metadata now match their locked
contracts more closely. Locked incremental and work-count receipts authenticate
the exercised behavior, while durable corpus roots, split-grammar layouts, and
bounded floors make real-corpus checks reproducible. The authenticated
production receipt at 2c702656 measures public Parser.Parse at 4.886056x C
by equal-fixture geomean, 5.517602x C by fixed-suite sum, and 5.648204x C on the
worst fixture against the locked static -O2 C oracle.
MISSING patterns now test missing nodes, and inert #is?/#is-not?
properties are available through public metadata accessors. Descendant range
walks now match upstream behavior for reversed ranges and zero-width missing
children.-O2 C oracle. At the v0.39.0 production-code baseline 2c702656,
public Parser.Parse measures 4.886056x C by equal-fixture geomean and
5.517602x C by fixed-suite sum of medians, with a 5.648204x worst fixture.Incremental-correctness, full-parse-efficiency, and benchmark-hardening release. Incremental parsing now preserves fresh-parse selection across GLR re
Incremental-correctness, full-parse-efficiency, and benchmark-hardening release. Incremental parsing now preserves fresh-parse selection across GLR reuse, score, cull, and retry edges; terminal materialization stops and multiline edits report accurately; evidence-gated arena and merge policies reduce full-parse cost; and authenticated static-C, fleet, and forest measurements are stricter.
incremental_parse_full_retry
reporting on grammars whose intended trees contain ERROR productions and
legitimately use the full GLR width.Tree.ParseStopReason instead of accepted. Previously such a parse could
return a sentinel full-span ERROR root labeled as a successful parse.no_static_c_oracle, no_corpus, and no_corpus_files shards as fatal
closure findings in the combined artifact. Certification remains fail-closed,
and report mode still rejects untyped, contradictory, or mixed oracle
evidence.query_compile fixture. A separate ordinary untagged Go
child performs admission before tagged Go and fully static C diagnostic
children report saturating direct action/pop/selected-tree counters and
explicitly labeled representation proxies. Go counters attribute each
parseInternal attempt to a logical retry rung, resolved cap mode, parser
loop, and finalization; accept_actions is explicitly an action count, and
aggregate counters must equal attempts plus the outside-attempt residual.
Frozen retry-active and straight-LR witnesses pin the attribution semantics;
a Go-only v3 supplement now records a bounded, attempt-local convergence
frontier across reduction selection, post-reduce packing, boundary merge and
cull, pending work, terminal acceptance, packed-root expansion, and final
selection. It retains the first 256 events plus first rejection evidence,
uses attempt-local decision IDs for target/candidate pairs, records scanner
checkpoint identity at the current token election, detects partial merge
mutations from exact semantic GSS writes, separates saturation from
truncation, serializes no pointer identities, and
leaves the shared v2 Go/static-C counter semantics unchanged. Authenticated
v4 receipts bind both manifests and fail closed on malformed convergence
payloads.
Authoritative receipts require a clean Git source identity; compile from
sealed private Go and C input snapshots; bind sanitized build/runtime
environments; independently verify fixture, grammar, GLR-regime, span, and
deep-tree identities; contain the complete cold static-C admission plus all
repository, compiler, linker, identity, and linkage-verifier descendants in
wall-bounded process groups; and publish atomically only after all rechecks
pass.() or (void) parameter spelling, restoring artifact
construction for SCSS while rejecting genuinely parameterized near misses.Nothing published for this version
Nothing published for this version
Full-parse benchmark-integrity, forest-certification, and GLR-performance release. Publication now uses one locked static C oracle and authenticated,
Full-parse benchmark-integrity, forest-certification, and GLR-performance release. Publication now uses one locked static C oracle and authenticated, forking real-Go fixtures; authenticated C-first fleet evidence gates automatic forest routes; general multi-stack work is reduced; and high-level highlight and tag parsing can be bounded. The 206-grammar curated structural-parity milestone remains banked.
ErrParseStoppedEarly while skipping query execution.ParseForestExperimental now reports only a tree produced by the
experimental forest parser. A forest decline returns nil, false with
ForestDeclineInfo diagnostics instead of silently substituting a
production-parser result, so callers can measure and certify forest routing
without mistaking fallback work for a forest success..gts-extracted/<language> directory; tracked changes and untracked files
elsewhere still fail authentication. The production lane separately times
and verifies the actual forest-enabled automatic route on every file, so
promotion requires exact routed parity and a net wall-time improvement after
production fallbacks, not merely a fast forest attempt.no_forest_coverage when a
complete authenticated C-oracle shard declines every file without timing
out. The reducer skips the potentially expensive production lane for that
non-promotable class while leaving missing and timeout-ambiguous evidence
incomplete.go.mod. This lets authenticated manifests
cover every lock entry that has an eligible source while keeping explicit
lock matchers authoritative.Automatic forest routing now covers the exact checked-in AWK, KDL, and Uxntal grammar artifacts after authenticated corpus gates found zero forest/C-oracle divergence on accepted forest files, zero routed/production divergence on every file, and an aggregate route wall-time win. The opt-in is attached through blob-identity runtime profiles, so same-name custom and adapted grammars remain on the conservative production path.
Multi-stack DFA token elections now scan each unique active parser state once and reuse that result while scoring candidates, instead of rescanning the state for every candidate. The authenticated real-Go matrix avoided 80-84% of those repeated scans and improved full parse by 3.5-9.8% across four fixtures, with unchanged parser shape, arena bytes, allocations, and exact 25/25 strict Go parity.
GLR merge, hashing, shape, equivalence, and recovery-trace helpers now pass stack descriptors by pointer instead of repeatedly copying the 104-byte values. The authenticated real-Go matrix improved by 3.54% geomean, with every fixture improved or statistically unchanged and identical arena, token, stack, iteration, node, depth, and normalization counters.
Fresh full parses now share the parser's existing no-error-payload proof with
GSS merge and C-recovery cost selection, avoiding recursive graph and subtree
walks until an ERROR, MISSING, or inherited error is actually
constructed. Paired runs of a 148 KiB clean Java witness improved by 43-47%
with unchanged full-span acceptance; isolated Go, Python, and Swift corpus
parity remained exact, and incremental/reuse parses retain the conservative
path.
Conflict-reduction frontiers now reuse one fixed-table lookup when reading
and updating the forked and seen flags for a reduction key. Paired runs
of a 707 KiB clean Dart witness improved by a further 6-13%, with fresh and
incremental C parity unchanged.
Automatic forest dispatch for the exact built-in JavaScript grammar now limits the speculative forest phase to 128 MiB while preserving the caller's full budget for the production fallback and for explicit forest parsing. A 20,784-file locked-corpus comparison preserved every tree, byte range, span, error, and stop outcome while reducing aggregate parse time by 3.09%, allocated bytes by 2.96%, and peak RSS by 19.02%. Caller-provided, modified, and same-name grammars retain the existing full-budget behavior.
.gitattributes rule makes Git report a fresh
clone as modified, while continuing to reject real byte, mode, and untracked
changes.-O2 C artifact, and times
immutable, clean, forking real-Go fixtures with symmetric tree lifecycles.
The generated 500-function source remains a straight-LR regression control;
its former 1.895x headline and 29% materialization decomposition are
withdrawn because the C lane used a different grammar and the source never
exercised the multi-stack path. A checked-in strict receipt driver now
reproduces the pinned-core Go-C-C-Go schedule; both C transports reject dirty
pinned-source caches, and the static lane snapshots each input once before
identity, parity, and timing checks. The first complete publication receipt
establishes the corrected full-parse baseline at 5.481673x C by equal-fixture
geomean and 6.313799x C for the fixed-suite sum of medians, with per-fixture
ratios from 4.639849x to 6.513909x.Nothing published for this version
Parser recovery, recurring-work, grammar-contract, and browser-runtime release. C-recovery elections and retained memo invalidation reduce fixed overh
Parser recovery, recurring-work, grammar-contract, and browser-runtime release. C-recovery elections and retained memo invalidation reduce fixed overhead; retry selection and generated-language provenance are stricter; and the browser runtime gains persistent incremental documents plus reproducible selected- language bundles for Go and TinyGo.
This release supersedes v0.35.0. That tag was published from incomplete ancestry; its browser-runtime changes have been reconciled here with every change on the current main line. The v0.35.0 tag remains immutable so existing Go module downloads continue to identify one source revision.
open, update, close, and queryDocument. Updates compute a
surrogate-safe minimal edit, reuse the prior parse tree, and run highlights,
tags, and bounded queries over the same retained tree while leaving the
existing stateless parse, query, and highlight APIs intact.cmd/wasmassets now emits reproducible single-language browser bundles for
either the Go or TinyGo WebAssembly compiler. Bundles contain the external
grammar blob, highlight and optional tags queries, the matching compiler
bootstrap, and a manifest with compiler identity and SHA-256 digests; the
runtime build is restricted to the selected grammar's tables, registry, and
scanner support instead of embedding the full grammar fleet.syscall/js.ValueOf path while
preserving the richer structured-tree and bounded-query wire formats.REAL_CORPUS_ONLY, allowing a
reproducible single-language run without switching to a different wrapper.grammargen emit go command without LR splitting.Nothing published for this version
Nothing published for this version
Forest-routing performance and compatibility-hygiene release. Automatic dispatch now avoids five language paths that consistently discarded their fore
Forest-routing performance and compatibility-hygiene release. Automatic dispatch now avoids five language paths that consistently discarded their forest result, while confirmed-dead C, C++, and Rust compatibility walks are removed after full-corpus verification.
_top_level_item node
before cutting; none found, including on the truncated/error-inducing
corpus phase). Zero rewrites were observed across every corpus file in both
phases for all five passes. The fused walk itself remains — its builtin
primitive-type-identifier promotion and preprocessor newline-span extension
handlers are confirmed live and unaffected. normalizeCTranslationUnitRoot
and the typedef-struct error-recovery branch remain untouched pending their
own repros. Net ~575 lines removed from parser_result_c.go (~944
including pruned dead-pass-only tests); verified byte-identical
(S-expression and span hashes) across the entire c and cpp corpora (1,045
files), and both the root package's production-backed
BenchmarkCPPConditionClauseAmbiguityDFA and the grammars package's
BenchmarkParse_C show a statistically significant ~13-27% drop in parse
time and 26-50% drop in allocations per parse from dropping the two
full-tree walks.parser_result_rust_recovery.go), a full-tree walk gated on the source
containing true, false, .., or ; — a gate that opens on essentially
every real Rust file. A full-corpus re-verification (all 37,127 .rs files
under the rust corpus, parsed both clean and truncated to 55% on every
second file — 55,691 parses total) recorded 130,018 gate fires and zero
rewrites. The companion candidate, Rust's dot-range-expressions walk, was
re-verified the same way and found live (3,030 real rewrites on the same
corpus, the simplest case being a bare .. full-range slice index such as
s[..]) and is therefore kept untouched. Net 228 lines removed; verified
byte-identical (S-expression and full node-span dumps) on 30 real Rust
files spanning size and content (macro-heavy, ..-heavy), with the Rust
parity suite, including the dot-range-motivated weird-expressions fixture,
unaffected.Nothing published for this version
Recurring parser and forest performance, recovery allocation, compatibility, and lifecycle-hygiene release. Warm parsers avoid repeated stable forest
Recurring parser and forest performance, recovery allocation, compatibility, and lifecycle-hygiene release. Warm parsers avoid repeated stable forest declines and oversized runtime-record copies, missing-shift recovery reuses parser-state chains, exact bundled C# blobs skip redundant post-parse work, arena and browser-WASM lifetimes are tightened, and confirmed-dead compatibility code is removed.
Tree.ParseRuntime() remains a value API with its live
final-child-counter overlay unchanged. In pinned recurring benchmarks this
reduced the five-byte KDL floor by 11.2% and Java's registered token-source
path by 14.9%, with unchanged bytes and allocations per operation; the
standard full/incremental benchmark trio remained neutral.notnull constraints, Unicode identifier spans, scoped-lambda statements and
blocks, and LINQ query expressions, allowing the runtime to skip the five
corresponding post-parse passes for that certified blob. The implementations
remain quarantined conservative fallbacks for legacy blobs, grammargen output,
caller-built languages, and overrides unless those artifacts explicitly carry
the relevant append-only capability bits. Runtime-profile attachment remains
pinned to the exact blob SHA; attaching scanner support by name alone does not
certify native result shapes. The skip is backed by the 1,700-file C# corpus
sweep, the original motivating fixtures, an 84-program LINQ battery, explicit
capability round-trip and identity gates, and direct embedded-grammar Unicode,
scoped-lambda, and LINQ regressions.Release now clear every matching stale
checkout reference from the pool's unused backing slots instead of remaining
reachable after rejection. Ordinary checkout and successful repooling remain
unchanged.truncated only when the 20,000-node
payload limit actually omits a node rather than when a tree exactly fills it.
Empty sources now return stable empty results from both bridges instead of
dereferencing a nil root; unexpected nil parse results and language handles
now fail safely at the browser boundary..,
whose sole job was synthesizing the anonymous . child under an
already-childless dot import-alias node — the DFA emits that child
directly on every real parse, so the walk visited every node in the tree
without ever performing its one rewrite; Java's entire compat block
(primitive-type token collapse, dotted-assignment-declaration reshape, and
recovered-program-root retagging — parser_result_java.go in full); Ruby's
then-span start walk; and three of Haskell's seven compat passes
(collapsed named-leaf children, let-bound local-binds start, and
quasiquote start). Zero rewrites were observed across every corpus file in
both phases despite substantial visit counts (Java's primitive-type check
alone matched 82,504 times). Haskell's remaining four passes — including
normalizeHaskellRootImportField, which rewrites on nearly every parse —
and Ruby's top-level module-bounds fixup, which fires on truncated input,
are unaffected and untouched. Net ~886 lines removed; verified
byte-identical (S-expression and span hashes) on real Go, Java, Ruby, and
Haskell samples, and a benchmark variant of the canonical Go parse
benchmark with a single added period (the synthetic canonical benchmark
source contains no . bytes and so never exercised the removed walk's
gate either way) shows a statistically significant ~37% drop in
allocations per parse from dropping the walk.Nothing published for this version
Nothing published for this version
Browser query/structured-tree, compatibility cleanup, clean-parse recovery performance, and Bash parity-coverage release. The runtime WASM target now
Browser query/structured-tree, compatibility cleanup, clean-parse recovery performance, and Bash parity-coverage release. The runtime WASM target now exposes structured parsing and queries with both UTF-8 and UTF-16 spans. Six dead JavaScript/TypeScript rewrites are gone, clean parses avoid recursively re-summing C-recovery subtrees, and Bash's committed real-corpus floor is backed by an executable witness.
loadBlob. Tree nodes and query
captures carry both canonical UTF-8 byte offsets and JavaScript UTF-16
code-unit offsets; node- and match-count limits report when results were
truncated.grammargen/bash_parity_test.go),
mirroring the existing Python witness. Previously the bash entry in the
real_corpus_parity_floors.json v3 floor file (25 eligible / 9 no-error / 6
S-expression / 6 deep) was phantom: the generic real-corpus loop skips any
grammar without a jsonPath/path, and bash had neither and no dedicated
test, so nothing exercised that floor. The new witness grammargen-compiles
the locked tree-sitter-bash grammar and reproduces the floor exactly,
skipping (not failing) when the corpus is not seeded locally. A companion
reducer test pins echo ${x} and echo ${#x} as working controls and
echo ${x:-y} as a self-healing known-defect witness for the underlying
grammargen expansion-suffix table defect.if/while) leaf retype,
empty_statement semicolon retype, existential_type collapse, call-
precedence reshape, and unary- and binary-precedence rotation, plus their
exclusively-owned helpers and an already-unreachable standalone fallback
path from an earlier compat-tier sunset. A census over roughly 23 MB of
real JavaScript/TypeScript/TSX (including undici.js and TypeScript's own
checker.ts, parser.ts, and utilities.ts), the original regression corpus
that added these passes, and independent adversarial precedence chains
found zero rewrites from any of the six; later grammargen table fixes
already produce the correct tree shape directly, so the passes had become
dead weight on every JS/TS/TSX parse. The compat pipeline's two remaining
live fixups (top-level object-literal reinterpretation and trailing-
continue-comment reattachment) and the memory-budget stop-polling on the
surviving walk are unaffected. Net ~1,100 lines removed; verified byte-
identical (S-expression and spans) on real JS, TS, and TSX samples.Memory containment, Python parity, and authenticated fleet-reporting release. Failed forest attempts now apply the parser's runtime heap and system me
Memory containment, Python parity, and authenticated fleet-reporting release. Failed forest attempts now apply the parser's runtime heap and system memory guard, and discarded forest GSS slab batches no longer remain live behind the retention cap. Python real-corpus S-expression and deep parity return to 25/25 after removal of a misfiring compatibility fold. Fleet reducers can publish valid failing scoreboards while certification remains blocking.
report mode publishes a recomputed PASS or FAIL fleet board
without turning valid failure evidence into a reducer error; the default
certify mode publishes the same artifact before blocking on a combined
FAIL. Exact stored shard gates may be PASS or FAIL, while missing, stale, or
malformed evidence still fails closed.--hostname and records it in run
metadata so one-language containers on the same physical benchmark host can
produce a consistent authenticated host identity.foldPythonTrailingSelfCallIntoNestedFunction, a Python
compat-normalization heuristic that spuriously folded a same-named trailing
call into a preceding nested function's block when that function's body
ended in a dangling ; before a dedent. Raw parser results already matched
the reference; only the post-parse fold diverged. Python real-corpus
S-expression and deep parity both improve from 20/25 to 25/25.Nothing published for this version
Recurring-parser performance and fleet-measurement integrity release. Reused parsers now invalidate the 16,384-entry clean-zero front cache by epoch,
Recurring-parser performance and fleet-measurement integrity release. Reused parsers now invalidate the 16,384-entry clean-zero front cache by epoch, reducing recurring one-byte KDL and JSON wall time by 33.10% and 35.67% with unchanged allocation counts while the primary benchmark trio remains neutral. Certified runtime profiles retain the required D, Groovy, and C# retry policies. The real-corpus tooling now distinguishes clean, error-bearing, and stopped parses and can reduce revision-pinned one-language checkpoints into a single authenticated fleet report without rerunning parsers.
real_corpus_inventory --require-corpus-sources now rejects pinned corpus
checkouts that contain no benchmark-eligible regular files matching the
language's source policy. Inventory and benchmarks share traversal and
subdirectory validation, so invalid paths and scan failures are reported
instead of allowing an empty language sweep to appear complete.Recurring-parser performance and compatibility-cleanup release. Repeated small parses now pay for the current input rather than stale pooled capacity,
Recurring-parser performance and compatibility-cleanup release. Repeated small parses now pay for the current input rather than stale pooled capacity, forest parsing returns its token-source resources promptly, and the common small forest indexes stay inline. On the recurring C# and CSS witnesses, wall time falls 34–35% and allocated bytes fall 81–82%; across a selected six-language family, geomean wall time falls 3.18% and bytes fall 6.81%. The primary Go benchmark trio remains neutral while full-parse bytes fall 18.68%.
gssForestIndex and forestAlternativeIndex keep their common small sets in
inline storage and allocate spill space only when needed. Insertion order,
lookup identity, and cache reset semantics are unchanged.trailingSpanRules table
(normalizeResultTrailingSpanCompatibility) instead of six separate
runLanguageResultCompatibility switch arms and four hand-written wrapper
functions (normalizeNimTopLevelCallEnd, normalizeCommentTrailingExtraTrivia,
normalizeRSTTopLevelSectionEnd, normalizeFortranStatementLineBreaks).
Each row names the language, the shared primitive it drives (extend the
sole top-level child across a trailing line break, trim a trailing
invisible extra-trivia child at the root, shrink a top-level child's end
off trailing whitespace, or extend a statement across the line break
before its next sibling), and that primitive's node-kind parameters, so
adding another language to any of these four span shapes is a table row,
not a new function. Fortran's statement-vs-sibling pass is generalized
from a hardcoded program/program_statement walk into
extendChildLineBreakBeforeNextSibling, parameterized the same way.
The four wrapper functions being retired were already thin call-throughs
into shared primitives from an earlier consolidation, so this pass nets a
modest line increase (the switch/wrapper boilerplate shrinks, but the new
table and its per-row rationale comments are larger than the code they
replace) in exchange for one auditable, greppable rule set instead of six
scattered dispatch sites.gomodRepetitionShiftConflictChoice, dartRepetitionShiftConflictChoice,
cRepetitionShiftConflictChoice) are retired in favor of certified,
blob-SHA-pinned ConflictPolicies rows in grammars/runtime_profiles.go.
C's rule recurs at thousands of table rows (reduce-symbol identity alone,
not table position), so it is the first profile to use two new sentinel
values, ConflictPolicyAnyState/ConflictPolicyAnyLookahead, matching
every state/lookahead instead of one exact row. Dot's equivalent helper is
retired outright rather than migrated: it was already dead code in the
shipped dispatch path (dot never opted out of the engine-wide C
repetition-skip fold, which already folds it with a flat parse stack), and
reviving it as a live policy grew the LR parse-stack depth O(n) with
statement count for no fork-count benefit. C#'s helper is left in place: it
depends on the literal source text of a contextual keyword (scoped),
which ConflictPolicies' state/lookahead-symbol matching cannot express.Containment closure and measurement-honesty release. The runtime memory budget is now path-uniform across every public parse construction: the parse l
Containment closure and measurement-honesty release. The runtime memory
budget is now path-uniform across every public parse construction: the
parse loop, the Go compat walk, and the JS/TS fused compat walk all poll
the same budget and surface the same stop reason. On the quiet host, a
bare Parse of the Poppler witness (3.4 MB ambiguous JavaScript) stops
bounded at ~1.78 GiB peak RSS under the default 512 MiB budget — a path
that previously escaped accounting entirely — and completes clean under a
2 GiB budget. Error-recovery throughput improves ~18% on recovery-heavy
workloads, and the perf ledger tooling learns to separate clean-parse
from error-recovery throughput so tail-language ratchet rows stop
conflating the two.
cNodeErrorCost/cNodeVisibleSubtreeCount) is now a fixed-capacity,
pointer-keyed 2-way set-associative cache instead of a
map[*Node]cNodeMemoEntry: warm CPU profiles of error-bearing parses on
fleet-tail languages (kdl, uxntal) showed runtime.mapaccess2_fast64 as
the single hottest leaf, driven almost entirely by these two lookups.
Every decision made by the recovery cost-competition machinery
(cRecoverStrategy1Election, cHandleError, cCondenseAndResume, etc.)
is unchanged — a cache miss simply falls back to the same full recompute
as before. The cache starts small (matching the old map's practical
per-parse footprint) and grows to its full working-set size only the
first time a parse actually enters C error handling, so clean parses of
recovery-capable grammars are unaffected (measured neutral-to-positive on
the canonical Go workload). A synthetic KDL truncated/garbage-suffix
recovery benchmark (BenchmarkKDLRecoveryGarbageSuffix) improves ~18%
(83.2ms to 68.2ms median, p=0.002, n=6).pointer_light_measurement_test.go,
pointer_light_soa_test.go) that measure bytes-per-node, GC scan
cost, and walk throughput for the current pointer-rich node layout
against a contiguous index-based layout, plus a
constructed-versus-final node census. These are the standing gate
instruments for the frozen-tree store investigation.parse_gap_report and parse_gap_correlate now split each language's
Go/C ratio by corpus-file policy: every sample is classified clean
(Go tree has no ERROR nodes and did not stop early) or error-bearing, and
the per-language ledger reports clean_ratio/error_ratio plus
clean_file_count/error_file_count/error_file_share alongside the
existing combined ratio. This keeps an error-dense tail-language corpus
from making clean-parse throughput look artificially slow in ratchet
decisions.Containment and canonical-parse-lever release. Memory-budget enforcement is now layered (volume-triggered polling, in-merge checks, and an absolute ha
Containment and canonical-parse-lever release. Memory-budget enforcement is now layered (volume-triggered polling, in-merge checks, and an absolute hard ceiling) so runaway parses stop instead of ballooning, while certified bounded-overshoot witnesses still complete. Two independent hot-path levers land together: single-stack raw-shape elision and supertype hidden-choice collapse. Combined same-host receipt on the canonical Go workload: full parse 12.25 ms to 10.91 ms — 2.14x to 1.89x the C runtime measured in the same session — with allocations unchanged (9 per full parse, zero on both incremental lanes). The compat tier continues shrinking, the field-map generation ceiling is lifted (Bash and Dart now carry real-corpus floor rows), and parity floors are reproducible against lock-pinned corpora.
Memory-budget containment is now layered: volume-triggered polling
forces a real budget check whenever tracked arena growth exceeds 64 MiB
since the last check (bypassing the iteration-count poll mask), the GLR
stack-merge survivor loop polls the budget mid-grind, and a decoupled
absolute hard ceiling (GOT_PARSE_MEMORY_HARD_CEILING_MB, default
2048, 0 = off) stops runaway growth regardless of soft-budget
overshoot tolerance. A bare-Parse giant-table witness now stops with
ParseStopMemoryBudget at 2.6-4x budget instead of ballooning; the
Poppler witness still completes full-span under its certified 2 GiB
budget.
A hard zero-cliff gate for nightly fleet perf sweeps, with a hard-gate-only mode on the perf-scan budget checker; the scheduled perf-scan gate is disabled in favor of the nightly hard gate.
Runtime profiles for ASM (bounded stack retries), Haxe, Odin, and SCSS.
Dedicated non-terminal alias-map parity coverage: derivation gates for Go, Swift, and Caddy mirroring the Lua gate, plus live-parse regression tests for each language's alias behaviors.
BENCH.md: the canonical performance-claims page, including the first
pinned quiet-host receipt for the corrected full-parse benchmark and a
same-host C-baseline calibration (full parse 2.14x C on the canonical
workload; incremental lanes orders of magnitude faster than the cgo
binding path).
docs/compat-tier.md documenting the C-faithful result-normalization
tier and its retirement policy.
A reproducible real-corpus floors workflow: corpora seeded at
grammars/languages.lock SHAs (scripts/seed_real_corpus_from_lock.sh
plus a committed seed manifest), opt-in ratchet regeneration, and floor
artifacts captured in the mounted workspace.
resultCollapsedNamedLeafRules table
(previously data-driven for Ruby and Apex only): Kotlin's
identifier -> simple_identifier, Hack's true/false/null literal
wrappers, Dart's super/this, and Elixir's nil are now table rows
instead of hand-written adapter functions. The table gained a bySource
column so a row can pick the source-text-verified matcher
(normalizeCollapsedNamedLeafChildrenBySource, needed when the
collapsed span must be confirmed before a child is attached) instead of
the plain structural one. Hack's dedicated compat file and switch arm
are retired entirely (all three of its rules were table-eligible); Dart
and Elixir keep their compat functions for unrelated rewrites but lose
the adapter that only fired these rules. Net ~37 lines of per-language
adapter code retired in favor of ~7 declarative table rows. Haskell's
wildcard -> "_" was evaluated for the same migration but left
in place: the anonymous token name "_" collides with the special
query-wildcard sentinel in Language.symbolByNameAndNamed/SymbolByName
(both short-circuit to (0, true) for name == "_"), so migrating it
through the shared table resolves the child to Symbol(0) (EOF) instead
of the real anonymous _ token; OCaml, HCL, and Rust were left
unmigrated too (OCaml's and most of HCL's rules need multi-candidate
source disambiguation the one-parent/one-child schema doesn't represent,
and HCL/Rust also fold their collapse checks into a single perf-tuned
tree walk that per-rule table entries would fragment).grammargen's hidden-choice passthrough table no longer excludes supertype
symbols whose alternatives are all neutral-unary; Go's _statement and
_simple_statement wrappers now collapse in the zero-allocation unary
reduce path (1,500 wrapper nodes eliminated per canonical-workload parse).
Only two bits change in the regenerated go.bin — parse tables, field
maps, alias and supertype query tables are byte-identical, and supertype
query predicates match by concrete descendant so observable trees and
captures are unchanged. Canonical quiet-host full parse improves ~3.4%.
Raw-shape capture and content hashing are elided while a parse has only ever had a single GLR stack and has not entered error recovery; capture resumes permanently at the first fork or recovery event. Shape-dependent tie-breaks are unaffected: elided prefix nodes are only ever compared to themselves (structural pointer-sharing), evidenced by forced-descent and recovery differential tests. Canonical quiet-host full parse improves ~4.8% with allocations unchanged (9/0/0 preserved).
gssNode layout compacted to a 64-byte budget on 64-bit targets (pointer-backed extra links with uint8 count/cap, uint32 depth, aggVisValid bool), enforced by a size-budget test and a compile-time uint8 guard; transient GSS slabs are recycled after linear demotion with address-keyed caches invalidated and fingerprinted spine memoization preserved. Canonical quiet-host lanes are timing-neutral with allocations unchanged (9/0/0).
Contiguous recovery cost calculation and recovery stack allocation are optimized; tree error state is cached and compat walk frames reused.
Large-tree memory follow-up to v0.26.0. Exceptionally large completed full parses can now release arena storage retained by discarded GLR alternatives
Large-tree memory follow-up to v0.26.0. Exceptionally large completed full parses can now release arena storage retained by discarded GLR alternatives before returning to the caller. This patch does not change the public API.
Parser-memory, registry-lifecycle, and build-hygiene release following v0.25.0. It shrinks common node state, removes a per-parse ranking memo, and st
Parser-memory, registry-lifecycle, and build-hygiene release following v0.25.0.
It shrinks common node state, removes a per-parse ranking memo, and stops
returned trees from retaining parser-only shape overflow. This minor release
adds an exported diagnostic field; callers using positional ArenaBreakdown
literals must update them.
ArenaBreakdown.NodeFieldMetadataBytesAllocated reports storage used by
arena-backed node field metadata.ParseFilePooled replaces a cached parser pool when a same-name registry
update supplies a different language instance.Node from 144 to 104 bytes and removes
245,966,616 bytes from the exact Poppler arena allocation while preserving
exact structural parity.Nothing published for this version
Nothing published for this version
Nothing published for this version
Performance, memory, and runtime-hygiene release following v0.24.1. It makes pending-parent field metadata compact and exact, removes retired zero-onl
Performance, memory, and runtime-hygiene release following v0.24.1. It makes pending-parent field metadata compact and exact, removes retired zero-only telemetry, and narrows redundant Java retry passes behind an exact-blob profile. This minor release intentionally includes the exported diagnostic telemetry removals listed below. It also re-certifies the exact Poppler witness inside a hard 2 GiB envelope without claiming that JavaScript's throughput tail is closed.
no_alias reduction-attribution lane from
ParseRuntime, ArenaBreakdown, PerfCounters, and the Java/Python and
parse-gap reports. The path has had no production producer since reductions
moved to all_visible or scratch_no_alias; every exposed value was
permanently zero.Nothing published for this version
Performance-contract and repository-hygiene follow-up to v0.24.0. This patch corrects the canonical full-parse benchmark before the long-tail optimiza
Performance-contract and repository-hygiene follow-up to v0.24.0. This patch corrects the canonical full-parse benchmark before the long-tail optimization campaign continues, banks focused Caddy and Kotlin wins with fail-closed certification, and deletes superseded conflict and profiling machinery. It does not change the v0.24.0 Poppler memory claim or declare the remaining fleet performance tail closed.
cmd/ts2go now accepts non-terminal aliases from the grammar's alias-symbol
range instead of incorrectly rejecting every alias ID above SymbolCount.BenchmarkGoParseFullDFA now exercises the public Parser.Parse path and a
fully materialized tree. The former implementation silently enabled the
no-tree diagnostic and was mislabeled as a full parse.ParseNoResultCompatibilityBenchmarkOnly no longer implicitly enables the
no-tree path. Its result is materialized, so parse_gap_report can separate
no-tree parser-core cost from the broader no-compat diagnostic. Some
large-input diagnostic materialization strategies still key off this mode,
so it is not yet a pure compatibility-only A/B.BenchmarkGoParseCoreDFA lane and withdrew
the older generated-Go full-parse headline pending a pinned quiet-host rerun
of the corrected public benchmark.parse_gap_report, the retained shape
harness, and standard Go profiles.Nothing published for this version
JavaScript large-file parity and parser memory-economy release. With an explicit 2 GiB parser budget, the 3,447,275-byte Poppler witness now reaches e
JavaScript large-file parity and parser memory-economy release. With an explicit 2 GiB parser budget, the 3,447,275-byte Poppler witness now reaches exact EOF with no error and exact structural parity. Its allocation and arena-capacity reductions reproduced in a same-day base/head audit, and a separate single-pass runtime gate completes inside a hard 2 GiB container. JavaScript's broader focused gate is 25/25 no-error, S-expression, and deep parity. The shipped 512 MiB Poppler budget gap remains open and tracked in the performance ledger.
GOT_TRANSIENT_REDUCE_CHECKPOINT_MB path that materializes the
live linear stack and reuses transient slabs once a configured threshold is
crossed.Node, rawShape, and rawShapeChild layouts remove alignment waste and
pack raw-shape edge metadata, shrinking the records from 152 to 144 bytes,
32 to 24 bytes, and 24 to 16 bytes respectively.Parser so attribution adds no
steady-state parser-core allocation. The v0.24.0 978 B/5 allocs sample
used the then-mislabeled no-tree benchmark and is not a full-parse allocation
claim; both incremental lanes remained at zero allocation.Generator throughput and certification follow-up. This cut banks the shared, deterministic blob encoder and the bounded recursive-extra construction t
Generator throughput and certification follow-up. This cut banks the shared, deterministic blob encoder and the bounded recursive-extra construction that landed immediately after the exhaustive-parity release. It also removes the C# generation cliff caused by repeatedly rebuilding the same skipped-extra lex-preemption analysis. The release does not claim that Crystal's broader real-corpus parity tail is closed; the newly visible floors remain explicit.
cmd/ts2go blob production now share one
deterministic encoder, including stable ordering for map-bearing trailer
data and preservation of large-state GOTO metadata.Exhaustive parity closure release. The curated structural matrix is now 206/206 pass with no known-degraded skips: the stale-skip ratchet landed first
Exhaustive parity closure release. The curated structural matrix is now 206/206 pass with no known-degraded skips: the stale-skip ratchet landed first, then the final Norg alias-target divergence was fixed and its exemption removed. This cut also banks the parser, recovery, scanner, and Wave 3 measurement work that landed after v0.22.5. It does not claim that every measured grammar is near-C on performance; the remaining JavaScript, Scala, and other cliffs stay explicit in the perf ledger rather than being hidden by the release milestone.
EXEC CICS error normalization now trims recovered
procedure_division/program_definition spans to the last material child
when C stops before trailing trivia, while preserving C's zero-width EOF
recovery shape. A cgo-backed adversarial fixture now guards the recovered
error signal and byte spans against the C oracle.Nothing published for this version
Nothing published for this version
Nothing published for this version
Scoped held-out perf-ratchet release. This release follows the fleet coverage cut with the exclusion machinery and ledger language needed to keep Wave
Scoped held-out perf-ratchet release. This release follows the fleet coverage cut with the exclusion machinery and ledger language needed to keep Wave 3 honest: Groovy is now budgeted under a named scoped basis, while D and F# remain explicit held-outs because their current large-file witnesses fail in the C-reference side or hit the harness RSS watchdog before a stable Go-vs-C ratio can be ratcheted.
GTS_PERF_SCAN_EXCLUDE_PATHS, persisted scoreboard config, and status
reporting for measurement-basis exclusions.perf_scan_status coverage accounting for scoped held-out budget rows, so
budgeted-with-caveat languages are visible separately from ordinary green
rows and hard held-outs.groovy/subprojects/performance/src/files/pleac11_15.groovy, with observed
full-parse and no-edit ratios recorded from the Docker perf sweep.measurement_basis.exclude_paths as budget loosening that requires the same
RCA evidence as loosening a ratio threshold.Wave-3 perf-fleet coverage and ongoing correctness checks. This release line extends perf-scan measurement coverage: the Go-vs-C full-parse ratio ratc
Wave-3 perf-fleet coverage and ongoing correctness checks. This release line extends perf-scan measurement coverage: the Go-vs-C full-parse ratio ratchet now covers 203/206 grammars (up from the targeted subset measured at the v0.22.0 checkpoint) via batches 1–7 plus a fleet gap-close sweep, while keeping the three held-out grammars explicit in the ledger. It does not yet claim universal near-C throughput: the ratchet records where every grammar stands, including held-out rows and known cliffs, and optimizing that tail plus a memory-blowup class in a few grammars remains tracked for the next waves.
perf_scan_status
coverage reporting and CI budget validation.parser_result_* and recovery-path PRs,
so masking-normalization or recovery changes surface byte-exact
verification against the tree-sitter v0.25.0 oracle instead of relying only
on smoke coverage.Language.NonTerminalAliasMap, with Lua parity,
shipped-blob inventory coverage, and synthetic edge-case tests for
self-recursive alias wrappers, singleton aliases, terminal aliases, and
deterministic row ordering.EXEC CICS
parity fix below, retaining the 25/25 real-corpus and 20/20 direct C-oracle
parity gates for this line.EXEC CICS error parity aligned with the C parser.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Cobol frontier and perf-ratchet release. This release completes the focused Wave 4 Cobol frontier work and adds the first checked-in Wave 3 perf budge
Cobol frontier and perf-ratchet release. This release completes the focused Wave 4 Cobol frontier work and adds the first checked-in Wave 3 perf budget ratchet. It does not claim universal near-C performance; the ratchet and CI validator make future claims auditable.
cgo_harness/cmd/perf_scan_budget and the initial 20-language perf-ratio
budget seed, with a fast CI validation job wired into the aggregate build.ERROR regions so
recovered trees keep the C-oracle error carriers instead of timing out or
dropping them.Nothing published for this version
C++ recovery parity fold. This release fixes the focused C++ malformed-class recovery gap without enabling cpp C-recovery globally.
C++ recovery parity fold. This release fixes the focused C++ malformed-class recovery gap without enabling cpp C-recovery globally.
REPRO_GO_BACKEND=registry mode for C tree-dump
diagnostics.class bodies followed by void A::b() {} now normalize to the
C-oracle recovered function_definition shape.class_specifier, retagged namespace_identifier, and nested extra
ERROR(identifier) shapes.Cobol oracle cleanup and CI/dead-code maintenance release.
Cobol oracle cleanup and CI/dead-code maintenance release.
Nothing published for this version
Nothing published for this version
Roadmap checkpoint release after the v0.21 engine cut. This release lands the first four campaign buckets after v0.21.0: the runtime/recovery foundati
Roadmap checkpoint release after the v0.21 engine cut. This release lands the first four campaign buckets after v0.21.0: the runtime/recovery foundation, the external lex-state election ledger, broad precise ExternalLexStates coverage, and the Cobol large-table/recovery cleanup. It does not claim that all grammar tiers are parity-clean yet; the remaining tier-IV rows stay visible and classified for the next campaign waves. It also does not claim universal near-C parser performance across the registry yet; v0.22.0 publishes the perf-scan scaffold and targeted wins while the broader wave-3 ratchet remains tracked for the next release line.
cgo_harness/perf_scan: a nightly Go-vs-C scoring harness and CI proposal
for tracking full-parse and incremental parser performance without mixing
correctness and performance gates.cgo_harness/tier_scan/external_lex_elections.{md,json}), including the
default-elected, staged, missing-ELS, and no-scanner categories used by the
C-recovery rollout.uint16. The runtime now supports large state targets, and the
generator reports actionable boundary errors for unsupported table shapes.HasError state, so a clean recovered header no longer masks a separate
retained error in the same procedure_division subtree.Nothing published for this version
The engine release. The generalized GLR parser core — a C-faithful error recovery engine plus a GSS-forest fast path — replaces the v0.20.x per-langua
The engine release. The generalized GLR parser core — a C-faithful error recovery engine plus a GSS-forest fast path — replaces the v0.20.x per-language recovery approximations as the default runtime. Error recovery for 123 elected grammars now reproduces C tree-sitter's decisions (strategy-1 election order, per-stack-version error-mode lexing identity, error-cost model, and condense scheduling were each verified decision-for-decision against an instrumented tree-sitter v0.25.0 oracle). The campaign branch's full correctness backlog — 42 known failing tests at its peak — is zero in this release, and the root test suite dropped from ~340s to ~62s along the way.
_automatic_semicolon), replacing the grammar-level approximation. Fixes
the byte-strict ASI parity gap; spurious-HasError files on a large real
repo walk dropped 436 → 17.LexModes[0] at ERROR_STATE),
including an engine-side error-mode relex for custom token sources, with
the capability forwarded through included-range wrappers.module_repeat1 worklist blowup); the
EOF-recovery competition probe no longer declines ordinary clean input;
and Parser.SetTimeoutMicros is now enforced inside the forest path
(previously unenforceable for forest-dispatched languages)._whitespace extra tokens like C's
generated lexer instead of silently skipping horizontal whitespace, fixing
a 1-byte recovery-anchor divergence.f(a,b) = c[d] tuple assignments) no longer
corrupts the enclosing production or kills the stack; C's nested shape is
restored.-race suite now actually runs for non-draft PRs without
panicking Go's default per-package timeout (-timeout 35m -p 1, 60m job
budget); wall-clock boundedness contracts skip under -race
(instrumentation-slowdown measurement, not parser boundedness);
./grammargen runs as a non-blocking visibility step until its
enumerated pre-existing backlog (stale markdown blob, two Dart parity
gaps) is burned down.docs/authoring-languages.md — adding a language without forking:
grammar.json → grammargen → blob → Register/RegisterExtension/taproot,
the wantsForest opt-in, generator budgets, and blob provenance
discipline.docs/external-scanners.md — when a grammar needs an external scanner and
the Go porting contract (emit extras, C-EOF behavior, error-mode lexing,
token-source responsibilities), with Pawn's five externals as the worked
case study.grammars/clean_regression_pins_test.go).Patch release recovering C# large-namespace method/type declarations and the Swift ternary/conditional operator, both via post-parse source recovery p
Patch release recovering C# large-namespace method/type declarations and the
Swift ternary/conditional operator, both via post-parse source recovery
passes, plus a CI stability fix for the new C# recovery test under -race.
JsonTextReader.cs / JsonReader.cs) now recover their
method_declaration nodes instead of yielding only a comment-filled namespace
shell. Follow-up to #115/#116: the source-based type/method reconstruction was
gated off above 4096 bytes, so nothing rebuilt the members of a large collapsed
class. Namespace recovery now falls back, when the child-based pass surfaces no
method, to a per-member bounded source reconstruction — the type shell's
header is reparsed for its modifiers/name/base list, and each member is
recovered on its own (a method via signature-shell + lenient block, other
members by a single small wrapped reparse), skipping any that still won't parse.
Each reparse is a single small snippet capped by size and count and honors the
parser timeout, so the anti-OOM guarantees from #64/#98/#106 are preserved and
the whole-file 4096-byte gate is unchanged. JsonTextReader.cs now recovers 68
methods (was 0) and JsonReader.cs 41 (was 0). Thanks @richardwooding (#136, #138).cond ? a : b) now recovers instead of
dropping ? a : b into an ERROR node in every position. The runtime Swift
blob never fired the ternary_expression reduction, so any function containing
a ternary lost its whole parse (collapsing to
_modifierless_function_declaration_no_body). A post-parse recovery pass
reconstructs the ternary_expression — reparsing the source with each
? if_true : if_false tail blanked so the condition parses in place, then
splicing a synthesised node with the upstream condition/if_true/if_false
layout. The rewrite is accepted only when the result is error-free and
byte-faithful, so non-ternary code is never affected. Thanks @richardwooding
(#135, #137).TestCSharpLargeShreddedNamespaceRecoversMethods now skips under go test -race: the per-member bounded recovery reparses each class member as its
own small GLR parse, which normally finishes well inside the parser's
timeout budget, but race-detector instrumentation slows the same work enough
to trip the parser's internal wall-clock timeout. Non-race coverage keeps
the full recovery assertions; mirrors the existing Scala realworld-recovery
-race skip.Nothing published for this version
Adds consumer-controllable forest parsing.
Adds consumer-controllable forest parsing.
Language.WantsForest field (gob-serialized into blobs), the
grammargen.Grammar.WantsForest flag, and a declarative
"gotreesitter": { "wantsForest": true } object in grammar.json (read by
ImportGrammarJSON, mirrored back by ExportGrammarJSON only when set, so
standard grammars' output is unchanged). Built-in languages keep their curated,
byte-range parity-certified forest defaults; consumer opt-in is at the
consumer's responsibility, with the forest's decline→production fallback still
preventing hard failures on declined inputs. ExtendGrammar inherits the flag
from its base grammar (#134).Patch release for parser timeout propagation and targeted language recovery scanner fixes merged after v0.20.6.
Patch release for parser timeout propagation and targeted language recovery scanner fixes merged after v0.20.6.
then, and, with, else, elif, and end, preventing
scanner panics on malformed or edge-case indentation (#129, #130).if … else if … chains no longer collapse the enclosing function to
_modifierless_function_declaration_no_body (#131). The trailing-closure
ambiguity recovery now follows the whole if/else-if chain — the chained if
keyword is swallowed into an ERROR node, so it is discovered by scanning from
the body's matching close brace — and requires a byte-faithful reparse so a
partially-bracketed chain (which silently truncates without an ERROR node) is
rejected rather than accepted (#132).Patch release for parser recovery correctness, grammargen parity, and the forest/performance workstream merged after v0.20.5.
Patch release for parser recovery correctness, grammargen parity, and the forest/performance workstream merged after v0.20.5.
ErrParseStoppedEarly for timeout,
cancellation, token-source EOF, and parser safety-limit partial trees while
preserving the returned tree for diagnostics.NodeAtByte and NamedNodeAtByte helpers on Tree and Node for editor
offset lookup without hand-written tree walks.grammars.LoadLanguage(name, blob) attaches registered external scanners and
external lex-state tables when loading raw grammar blobs.Language.Size() reports approximate decoded table and lookup-cache bytes for
diagnostics and cache policy decisions.{a}b=c,
matching the C parser on minified bundle shapes (#111).ParserPool.Parse crash reported against command_test.go and
completions_test.go (#110).children, fieldIDs, and
fieldSources aligned when a cyclic edge is removed (#121).source_file root when
child nodes contain parse errors, matching the root-shape behavior already
used for SQL and Swift (#112).grammargen now treats explicit precedence wrappers around finite string
choices, such as prec.right(choice("=", "+=", "-=")), as reducible
nonterminals instead of overlapping named lexer tokens. This restores wrapper
nodes and lets LR precedence resolve the intended conflict (#122).for…in loop over a range (0..<n, 0...n)
or a call expression (stride(from:to:by:)) no longer silently collapse to
_modifierless_function_declaration_no_body with the loop body spilled out as
file-level siblings. As with the if/while case, the loop body brace was
being consumed as a trailing closure of the iterable; recovery now re-parses
the affected for…in headers with synthetic parentheses around the iterable
and maps the result back to byte-faithful original coordinates. Because this
misparse produced no ERROR node, the recovery pass now runs whenever the
detection walk finds a collapsed header rather than only on errored trees
(#123).TestGoCobraLargeFileParseRegression, gated by
GTS_COBRA_REGRESSION_ROOT, for exact large-file release validation without
making normal test runs network- or corpus-dependent.grammargen no longer imports the grammars registry. The grammar.js importer (ImportGrammarJS) previously pulled in grammars for the embedded JavaScrip
grammargen no longer imports the grammars registry. The grammar.js
importer (ImportGrammarJS) previously pulled in grammars for the embedded
JavaScript language, which transitively bundled all ~200 grammar blobs
(~22MB) into every consumer that merely defined a grammar via the DSL —
including taproot and all downstream DSLs. The JS language is now injected
via SetJSGrammarProvider; blank-import grammargen/grammarjs (or cmds
that need -js) to register it. Net effect: grammargen, taproot, and
anything that only defines/loads a grammar are now grammar-registry-free.taproot/walk: a grammar-free core of the taproot harness. It loads a tree-sitter Language from a pre-generated blob (LanguageFromBlob) and navigates t
taproot/walk: a grammar-free core of the taproot harness. It loads a
tree-sitter Language from a pre-generated blob (LanguageFromBlob) and
navigates the CST (Walker, ParseFromBlob, ParseWithLanguage) depending
only on the gotreesitter runtime — not grammargen or the grammars
registry. DSLs that embed a generated grammar blob can now parse/highlight
without linking the ~200-grammar registry (~22 MB). The grammargen-backed
build-from-DSL fallbacks remain in taproot, which re-exports walk.Walker
so existing taproot.Walker/Parse callers are unaffected.C# files whose namespace body does not parse cleanly no longer collapse into a single top-level ERROR node with zero recoverable declarations. Namespa
ERROR node with zero recoverable declarations. Namespace
recovery now falls back to a best-effort namespace_declaration built from
the existing sub-parse, surfacing the type declarations (and the members that
parsed) instead of discarding the whole file. C# brace matching used during
recovery is now trivia-aware, so braces inside char literals, strings and
comments no longer truncate a recovered declaration's span (#115).if/while condition contains a comparison operator
(< / > / ==, etc.) no longer collapse into an ERROR tree with no
recoverable function_declaration. The body brace was being consumed as a
trailing closure of the condition's last operand; recovery now re-parses the
affected conditions with synthetic parentheses to remove the ambiguity and
maps the result back to byte-faithful original coordinates (#118).normalizeGoDotLeafChildren now walks dotted-selector chains with an
iterative DFS instead of recursion, removing a stack-depth risk on very long
selector chains.TestJavaScriptBlockThenAssignmentParsesClean, for the JavaScript
block-then-simple-assignment GLR collapse ({a}b=c, #111). The root cause is
the JSX-attribute-continuation ASI heuristic in the JS scanner; the fix is
still pending (targeted for the C-oracle-verified parity line). Remove the
t.Skip to validate once fixed.Your coding agent can read these notes before it upgrades. Set up the MCP server →