Resolver precision audit on v0.41.48: 43 wrong binds in 983 sampled, in four evidence classes #566
Labels
No labels
code-review
correctness
dos
performance
security
severity/high
severity/low
severity/medium
tech-debt
Kind/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
h-dv/code-index#566
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
A read-only audit of the released binary over the nine pinned corpus repos (331,752 resolved references). A codex worker took a deterministic sample per (language, rule), 983 binds, and judged each from the reference site and the target. I read the wrong-bind list; I did not re-judge the sample.
Result: 43 wrong, 1 undecidable. Controls on strong-evidence rules: 120 of 120 correct.
Caveat on the "correct" side: the judging marked ranges correct unless a row was flagged, so 43 is a floor on the wrong binds, not a precision estimate. The counts are not population-weighted.
The four classes, by the evidence that would have refused them
1. Absolute or global names (18). A name written as global binds to a namespaced project symbol of the same name.
\curl_share_init()→ a namespaced test shim;new \InvalidArgumentException→ the project's own subclass. Rule 11: 0 of 15 correct on php-guzzle.::Logger→Sinatra::Middleware::Logger. Rule 11: 0 of 3.2. Receiver identity (17). A member call on a receiver whose type is not a project type binds by name to a project method.
content_type.encode("ascii")→SessionBase.encode;apps.ready→ anAppConfig.readyin a file whose stem isapps.x.split(",").map→Sinatra::Streaming#map.syntax.clone()→Parse<T>::clone.z.readonly(x)(namespace factory) → the instance methodreadonly().3. Lexical and file isolation (5). The target is a binding no other file can see, or the site is a definition.
exports.request = req→var requestintest/exports.js;app.render = function render→ a helper intest/app.engine.js. Both sites define a member; rules 40/42 anchored the qualifier by FILE STEM.e→ a parameter in another file.4. Exact module or type path (4, Rust). Unqualified
Result→ a private one-parameter alias in another file;ast::Item→ an associated typeItem.Rules involved
Rule 11 (qualified flag plus a unique name, no check of what the qualifier says) and rule 43 (pure-relative qualifier plus same-package name) bind across files with no target-specific evidence; together 0.66% of resolved references. The qualifier tiers 40/42 anchor by file stem. The name tiers 12, 13 and 30 supply the receiver-identity cases.
Plan for the current train
\, Ruby::, C#global::), extending the PHP work already in progress for #531.Every change ships with a bind account against this release: removals shown wrong, additions shown correct.
Related: #531, #538, #541, #543.
🤖 Generated with Claude Code
Second, independent judge on the "correct" side of this audit.
The first auditor marked ranges correct unless a row was flagged, so the 939 correct verdicts were lenient. A different model (Gemini 4 Carbon) re-judged 140 of them from source without seeing the first reasons: 20 per language, name-based rules only (10–16, 20, 30, 40–44), selected by hash and saved before judging.
Result: 140 of 140 confirmed, 0 overturned, 0 undecidable. Each verdict carries one line of file:line evidence. I checked two citations against the source and both were exact, including a non-obvious one: Ruby
autoload :ExtensioninSinatra::Contribreally isSinatra::Contrib::Loader#autoload, throughextend Loader.What this supports: on this sample the first audit's correct side holds, so the 43 wrong binds are not the tip of a much larger undercount. With 0 of 140, the false-correct rate among those verdicts is unlikely to exceed about 2%. It says nothing new about the 43 themselves or about rules that were not sampled.
🤖 Generated with Claude Code
Status with v0.41.49 (released, PHP package 0.1.6 bundled)
namespace\marker; a name with a leading backslash binds only to the global symbol it names.Stays open for: Ruby
::Logger(three audited wrong targets), the receiver-less member binds of the audit, the Rust exact module/type path rows, and the file-isolation rules. Those rules are built (branchcodex-r2) and removed 19 wrong binds without losing a correct one, but their additions and two integration checks are not yet qualified, so they are deferred to the next train.Released in v0.41.50.
reachability_anchorcannot disambiguate a reference through its imports.Still open: the 33 wrong binds listed above that this change does not touch (31 inherited, 2 found as audit controls).
Merged into #531.
PHP global paths and import/module contradiction rules shipped; see global_roots.rs and qualifier_scope.rs regression tests.
Remaining: Receiver identity; Namespace and lexical identity. The residual audit needs row-level disposition.