Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This branch pins every resolved edge's target in tier-1 corpora to guard against silent resolution failures that the primary resolution-rate gate cannot detect.
Why This Mechanism Exists
The primary resolution-rate gate compares four integers —
resolved,unresolved,external,local_binding— to prevent regressions. But a reference that resolves to the wrong definition moves none of these integers. It is stillResolved, still one row, still one edge; only the target changed. The rate cannot see it, thedenominator_shrankcheck cannot see it, and the drift checks cannot see it, because none of them read a target.This is the exact failure mode that the upcoming type-environment work will risk at scale: resolving a call to the wrong definition silently, with every gate staying green. The pin files and their comparison gate this blind spot.
What the Pins Cover
All tier-1 corpora carrying baselines are pinned:
Go: go-codeiq, go-caddy, go-probes
Java: java-commons-lang, java-gson, java-probes
JavaScript: javascript-express, javascript-fastify, javascript-probes
Python: python-django, python-flask, python-probes
TypeScript: typescript-vue-core, typescript-zod, typescript-probes
Coverage Rule
Every tier-1 corpus with a baseline carries a pin file. Probe corpora are pinned on the same rule as any other corpus because each probe file encodes one resolver contract that was got wrong once — a shadowed binding, a renamed package, a test-package split. Those edge cases are exactly what comes back wrong under a refactor. Their rows are few but load-bearing.
One-Command Regeneration
Each pin file header documents its regeneration command:
```bash
arthron pin corpus/LANG/CORPUS --pins pins/LANG-CORPUS.pins --write
```
For example, to re-pin the Go codeiq corpus:
```bash
arthron pin corpus/go/codeiq --pins pins/go-codeiq.pins --write
```
Mutation Proofs (from tests/edge_pins.rs)
The eleven comparisons (four probe corpora + seven main corpora + 2 tier-1 tier-2 tests) run in `.github/workflows/gate.yml` where `ARTHRON_REQUIRE_CORPUS=1` is set, costing 12.7 seconds of wall time against a 45-minute job.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SF9KvRKVzA2vEYqtFq23zm