Skip to content

v1.108.303 — The measurement was the defect

Choose a tag to compare

@jgravelle jgravelle released this 27 Aug 18:24
· 50 commits to main since this release

Five instruments reported a good number about something they could not observe, and four of them were ours.

The Rust fidelity harness graded a 37.9% collision rate as a perfect run

It keyed bare names in a set, and a set cannot count. Proven by deleting the second symbol of every duplicated name in the fixtures: extra and missing did not move — so extracting one of defs.rs's 108 is_switch scored like extracting all 108.

What it was hiding: impl Foo { fn new } and impl Bar { fn new } both emitted a bare new, kind function, parent None. The trait's own declaration qualified fine (T.go), so traits had an owner and impls did not. impl_item sat in symbol_node_types for the extractor's whole life and never produced one symbol, and a container becomes a parent only if it emitted one.

ripgrep @ 3fce3b5b: 1,331 of 3,514 symbols (37.9%) across 44 of 110 files → 55 (1.6%). 2,199 symbols move functionmethod. undercount and qual_mismatch now gate at 0; the oracle emits qual. The owner is self_ty, never the trait.

Two more gaps fell out of the new buckets: a const inside an impl came out bare (35 in ripgrep), and associated_type — a trait's type Carried; — was absent from RUST_SPEC.

PARSER_GENERATION 6 → 7.

Racket, thirteen entries, by @otherjoel (#556)

Twelve findings, one per commit, each measured against Racket's expander, Racket's reader, or five real package layouts on disk rather than against our own output.

#lang is now read before the grammar runs — #lang punct was indexing Markdown code samples, and conscript lost 61% of its definitions to four prose characters while fabricating ~100 that error recovery re-parented to module level. Collection paths resolve through info.rkt (splitflap 0 → 13 resolved edges, congame 304 → 624). Fidelity missing 475 → 362, and the define-generics exemption was removed rather than widened, because extra: 0 was carrying a fabrication.

He declined the PARSER_GENERATION bump deliberately and substituted a per-project racket_config_digest stamp — an absent key is detectable forever, a stamp equal to the constant is not. We bumped anyway for the Rust fix; his stamp is not redundant, it fires when a project edits racket_langs, which no global counter can see.

Three more

The observatory scored eleven public repositories on one commit of history. --depth=1 meant churn_surface read churn 1 for every file in every repo and ranked nothing but complexity. We were flattering ourselves along with everyone else: 81.3 (B) at depth 1, 75.6 (C) with real history.

max_nesting counted brackets, which in Python measures the deepest expressionindex_folder reported 3 where the AST says 6, an underreport by half that supported the opposite conclusion about the symbol.

.next, .nuxt, .output, .svelte-kit, .angular, .turbo, .parcel-cache and .dart_tool were indexed as source. .next/server/** is a transpiled copy of the pages you wrote, so a Next.js project got its own source twice, with the generated copy competing in ranking.

Also: three import cycles broken (cycles axis 5 → 2), and a recorded negative result — cache-hit rate cannot separate tool-surface arms, because a stable prefix raises numerator and denominator together.


Three of the five instruments were found by reading a competitor's fix titles against our own tree.

Full detail in CHANGELOG.md.