GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Fix VEX attesting beside an unpatched same-lock copy (#935, #938, #939) by mikolalysenko · Pull Request #940 · SocketDev/socket-patch

Conversation

@mikolalysenko

@mikolalysenko Mikola Lysenko (mikolalysenko) commented Oct 6, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Collaborator

LLM Description written by Claude Code:claude-opus-5-5

Fixes #938
Refs #935
Refs #939

Summary

A lockfile-only vex attested a package as not_affected even though the same lock also installed an unpatched copy of that exact name@version:

  • pnpm (Warn during pnpm scans when non-registry copies cannot be patched #935): a file: directory or file: tarball copy beside the Socket-wired registry entry.
  • yarn classic (Yarn classic VEX attests not_affected when yarn.lock also has a registry block for the patched name@version (e.g. after yarn add -W <pkg> --exact), though yarn installs only the unpatched registry copy #938): a registry block of the same version beside the Socket block, e.g. after yarn add -W left-pad --exact. yarn 1 installs one copy per name@version, from whichever block it resolves first.
  • yarn berry (Yarn berry hosted and vendored scans miss a file:/URL copy of the patched package locked under another dependency name, so lockfile VEX (and vendored VEX after install) attests not_affected while that copy installs unpatched #939): a file: / url copy locked under another dependency name (lp2@file:…). The resolutions pin never reaches it.

Root cause (shared)

VEX discovery had no shared same-lock rule. contest_across_locks (vex/discover/mod.rs) skips evidence from the ref's own lock (e.file != r.source_file), so each extractor wrote its own same-lock check. Only npm (push_uncontested unwired) and yarn classic git copies had one.

Change

  • Discovery::unpatched_copy + contest_within_locks (vex/discover/mod.rs): one same-lock rule every extractor shares. An extractor records a copy, and every ref of the same name@version in that lock is dropped with patched_ref_unattributable. The diagnostic names the copy's lock entry and how it installs. The copy also counts as resolved_elsewhere evidence for the cross-lock contest. It runs before contest_across_locks.
  • yarn classic: a non-Socket tarball block becomes a copy (Yarn classic VEX attests not_affected when yarn.lock also has a registry block for the patched name@version (e.g. after yarn add -W <pkg> --exact), though yarn installs only the unpatched registry copy #938). The git-copy post-filter (Hosted and vendored yarn classic modes rewire git-sourced yarn.lock entries, so every later yarn install fails while scan and VEX report success #363) now goes through the shared rule instead of its own loop.
  • pnpm: file: directory / tarball entries (v9 name@file: keys and legacy file: keys) become copies (Warn during pnpm scans when non-registry copies cannot be patched #935). Name and version come from the key and the name: / version: fields, falling back to the directory's or tarball's package.json. A directory holding another version is not a copy.
  • yarn berry: a non-Socket file: / url locator becomes a copy of the package it really holds (Yarn berry hosted and vendored scans miss a file:/URL copy of the patched package locked under another dependency name, so lockfile VEX (and vendored VEX after install) attests not_affected while that copy installs unpatched #939). The name is read from the file: tarball's package.json, the file: directory's package.json (path resolved against the locator= workspace), or the registry tarball url path (…/<name>/-/<name>-<version>.tgz). A copy whose package can't be read is left alone.
  • The vendored post-install vex gaps in Yarn classic VEX attests not_affected when yarn.lock also has a registry block for the patched name@version (e.g. after yarn add -W <pkg> --exact), though yarn installs only the unpatched registry copy #938 / Yarn berry hosted and vendored scans miss a file:/URL copy of the patched package locked under another dependency name, so lockfile VEX (and vendored VEX after install) attests not_affected while that copy installs unpatched #939 close through the same path. Discovery still recognizes the uuid but emits no ref for it, so the vendor ledger's claim is dead (rule 11) and is not attested.
  • Ports Route Gradle digests through utils::digest #878 (7eda8d8, cherry-pick of 659ac2c). main fails utils::digest::tests::production_digests_go_through_the_helpers (the coverage / test-release jobs), and Route Gradle digests through utils::digest #878 is the open fix. This becomes a no-op once Route Gradle digests through utils::digest #878 lands.

Why #935 and #939 are Refs, not Fixes

Both issues also ask the hosted / vendored scans to warn about the unreached copy. That is a separate gap in four rewriters (pnpm and berry, hosted and vendored), not this discovery boundary. This PR fixes the false VEX attestation for both. The scan warnings are left as a follow-up on those issues.

Test evidence

Regression tests, red with contest_within_locks disabled and green with it:

Issue Test
#935 vex::discover::npm::tests::issue_935_same_lock_file_copy_contests_the_pnpm_ref: v9 dir, v9 tgz, legacy dir, plus controls (wiring alone; dir of another version)
#938 vex::discover::yarn::tests::issue_938_classic_registry_block_of_the_same_version_contests_the_ref: plus control (registry block of another version)
#939 vex::discover::yarn::tests::issue_939_berry_other_name_copy_contests_the_ref: file: tgz, file: dir, registry url, plus controls (wiring alone; file: copies holding another package)

The existing classic_git_pattern_copies_are_never_attested also went red with the shared pass disabled, which confirms git copies now go through it.

Local runs:

  • cargo test -p socket-patch-core --all-features --lib: 5248 passed. 4 permission-based tests fail only because this sandbox runs as root (copy_tree symlinked root, vlt_heal unremovable lock, poetry / requirements write failure). They pass in CI on main's head. The 5th failure was the digest guard, fixed by the Route Gradle digests through utils::digest #878 port.
  • cargo test -p socket-patch-cli --all-features --lib --test e2e_vex_lockfile --test e2e_vex_redirect --test e2e_vex_vendor --test e2e_vex --test covgap_commands_vex: all green (847 + 12 + 19 + 311 + 31 + 28).
  • cargo clippy --workspace --all-features -- -D warnings: clean.
  • VEX discovery golden (redirect-npm.json): regenerated. The only change is an additive unpatched_copies section on yarn classic fixtures. No ref or diagnostic changed.
  • cargo fmt: touched files are formatted. main itself isn't cargo fmt --check clean (about 120 files), and CI doesn't run fmt.
  • Scan bench: the first push regressed yarn-classic/hosted / rescan by 16–18% because of a quadratic per-insert dedup. 980b7b6 removes it. A local socket-patch-bench compare --filter yarn-classic against main then shows +1.4% [-10.4, +8.1] and -3.0% [-8.1, +3.3], both ≈.

The npm / PyPI / gem wrappers don't need changes: this is Rust-only discovery logic.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RpNijzXr9S3AZY6xHUDwVH


Note

Medium Risk
Changes VEX discovery and attestation eligibility for npm-family locks when duplicate same-version install paths exist; behavior is fail-closed (drops refs, emits diagnostics) but affects security-relevant VEX output.

Overview
Stops false VEX not_affected claims when a lockfile both wires a package to a Socket patch and still installs an unpatched copy of the same name@version in that same lock—something cross-lock contest_across_locks never saw because it ignores evidence from the ref’s own file.

Discovery now has a shared unpatched_copy / contest_within_locks path: extractors record competing lock entries (with key + how they install), those copies also count as resolved_elsewhere, and matching refs are dropped with patched_ref_unattributable diagnostics that name the copy. The pass runs after all extractors and before cross-lock contesting.

pnpm (#935): file: directory and tarball entries (v9 and legacy keys); package identity from lock fields or the copy’s package.json / tarball.

Yarn classic (#938): non-Socket registry tarball blocks beside a Socket block (replacing a yarn-only post-filter); git and file: directory copies go through the same API.

Yarn berry (#939): file: / URL locators keyed under another dependency name; real package name from tarball, directory manifest, or registry URL path.

Golden discovery output gains an unpatched_copies section; regression tests cover the three issues plus controls (wrong version, different package, wiring alone).

Reviewed by Cursor Bugbot for commit acbac79. Configure here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@claude
Start fix for #935, #938, #939
8215c75
Assisted-by: Claude Code:claude-opus-5-5
This was referenced Oct 6, 2026
Warn during pnpm scans when non-registry copies cannot be patched #935
Closed
Yarn classic VEX attests not_affected when yarn.lock also has a registry block for the patched name@version (e.g. after yarn add -W <pkg> --exact), though yarn installs only the unpatched registry copy #938
Closed
Yarn berry hosted and vendored scans miss a file:/URL copy of the patched package locked under another dependency name, so lockfile VEX (and vendored VEX after install) attests not_affected while that copy installs unpatched #939
Closed
Claude (claude) added 3 commits October 6, 2026 13:48
@claude
Stop VEX attesting beside an unpatched lock copy
918a9ce
A lockfile-only `vex` attested a package as not_affected while the same
lock also installed an unpatched copy of that exact name@version:

- pnpm: a `file:` directory or tarball copy (#935)
- yarn classic: a registry block left beside the Socket block, e.g.
  after `yarn add -W left-pad --exact` (#938)
- yarn berry: a `file:` / url copy locked under another dependency
  name, which the `resolutions` pin never reaches (#939)

The cross-lock contest only weighs OTHER locks, and each extractor
wrote its own same-lock rule (npm and yarn classic git only). Discovery
now has one shared same-lock rule: extractors record an unpatched copy
and every ref of the same name@version in that lock is dropped with a
patched_ref_unattributable diagnostic naming the copy. Yarn classic's
git-copy filter moves onto it. The berry and pnpm extractors read the
copy's real package from its package.json (directory or tarball) or
from the registry tarball url.

Assisted-by: Claude Code:claude-opus-5-5
@claude
Route Gradle digests through utils::digest
7eda8d8
main has failed socket-patch-core's lib tests since Gradle support
(#646) and the digest helpers (#865) both landed. The guard test
production_digests_go_through_the_helpers flags three files #646 added
that still hash inline: crawlers/gradle_cache.rs, patch/jvm_jar.rs and
patch/sidecars/maven.rs. That breaks test, test-release and coverage on
every open PR.

Each inline sha1/sha256 call now goes through sha1_hex_of or
sha256_hex_of, which compute the same lowercase hex. Behaviour is
unchanged.

Assisted-by: Claude Code:claude-opus-5-5
(cherry picked from commit 659ac2c)
@claude
Drop quadratic dedup of same-lock copies
980b7b6
Every non-Socket yarn classic block is now recorded as a possible
unpatched copy, and each record scanned the whole list for a duplicate
first. On a 3000-package lock that made hosted scans and rescans about
17% slower in the scan benchmark. The list is already sorted and
deduplicated once when discovery finishes, so the per-record scan goes.

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko
Mikola Lysenko (mikolalysenko) marked this pull request as ready for review October 6, 2026 14:25
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator Author

BugBot review


Generated by Claude Code

cursor[bot] reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator Author

[agent] native (windows-latest, 1.2.0) (Bun patch compatibility, run 37476785866) failed on one cell: 1.2.0 workspace vendored → refusalCodesExact. The other 48 cells passed. I think this is the patch API, not this PR, but I haven't confirmed it yet:

  • the cell took ~15 s against ~1 s for its neighbours, and finished in the same second another cell got API request failed with status 504. That cell passed on the script's own retry.
  • this PR only changes the npm / pnpm / yarn VEX discovery readers. The Bun reader (vex/discover/bun.rs) and the Bun vendored backend are untouched.
  • the same workspace shape passed in hosted mode in this job, on every other Bun version on Windows, and on macOS.

The run is still in progress, so GitHub won't re-run the failed job yet (403 "already running"). I'll re-run it once when the run finishes. If it fails again, I'll pull captures/1.2.0-workspace-vendored/result.json from the job's results artifact and treat it as a real failure.


Generated by Claude Code

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

cursor[bot]
cursor Bot reviewed Oct 6, 2026
View reviewed changes

@cursor cursor Bot left a comment •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@mikolalysenko Mikola Lysenko (mikolalysenko) added the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 6, 2026
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator Author

Ready for review at 980b7b6.

  • CI: 517/517 latest check runs green or skipped. The one red job, native (windows-latest, 1.2.0) in Bun patch compatibility, failed at the install step. It passed on a rerun of the same commit. The PR doesn't touch Bun code.
  • Bugbot: reviewed 980b7b6 with no findings, and no review threads are unresolved.
  • Mergeability: 0 commits behind main, no conflicts. It's waiting only on a required human review.
  • For reviewers: the shared same-lock rule in vex/discover/mod.rs and how it's used in npm.rs and yarn.rs, plus the updated redirect-npm.json golden.

Generated by Claude Code

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Tanmay182003
Tanmay Singla (Tanmay182003) approved these changes Oct 6, 2026
View reviewed changes
@mikolalysenko Mikola Lysenko (mikolalysenko) removed the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 7, 2026
@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 7, 2026
Fix 15 open pnpm issues across hosted, vendored and agent modes #1007
Merged
@claude
Merge main into agent/fix-same-lock-unpatched-copy-vex
3869e7e
Conflicts:
- vex/discover/mod.rs: kept both main's ContestedRef/`contested` and
  this branch's UnpatchedCopy/`unpatched_copies` (structs, fields,
  finalize); `contest_within_locks` still runs before
  `contest_across_locks`, after main's new sbt extractor.
- vex/discover/testing/golden.rs: import and render both `contested`
  and `unpatched_copies`.
- vex/discover/yarn.rs: kept main's ClassicBlockSource match and
  classic_block_purl; main's #921 `file:` directory copies and the git
  copies now go through the shared `Discovery::unpatched_copy` rule
  instead of main's local post-filter loop (same diagnostic: names the
  lock entry and "file: directory").

Co-Authored-By: Claude <[email protected]>
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator Author

bugbot run


Generated by Claude Code

cursor[bot] reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

cursor[bot]
cursor Bot reviewed Oct 7, 2026
View reviewed changes

@cursor cursor Bot left a comment •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Mikola Lysenko (mikolalysenko) added 2 commits October 7, 2026 09:35
@mikolalysenko
Merge remote-tracking branch 'origin/main' into prfix/940
4ed7325
@mikolalysenko
Merge remote-tracking branch 'origin/main' into prfix/940
869c81f
@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 7, 2026
Stop VEX attesting over yarn PnP, pnpm bundled and deno.lock copies #1033
Merged
@mikolalysenko
Merge branch 'main' into agent/fix-same-lock-unpatched-copy-vex
acbac79
@mikolalysenko
Mikola Lysenko (mikolalysenko) enabled auto-merge (squash) October 7, 2026 15:25
@mikolalysenko
Mikola Lysenko (mikolalysenko) merged commit c5be5d1 into main Oct 7, 2026
88 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@mikolalysenko
Mikola Lysenko (mikolalysenko) deleted the agent/fix-same-lock-unpatched-copy-vex branch October 7, 2026 15:36
Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 7, 2026
@mikolalysenko @claude
Key scan GC, lockfile-only and overlap sets by PurlKey
af4a4ed
- `scan --prune --dry-run` previewed the vendor GC's manifest drop with a
  qualifier-strip relation while the wet pass used PurlKey, so NuGet case,
  PEP 503 and composer padding variants were pruned for real but not in
  the preview. Both now call vendor::unused_vendored_manifest_keys.
- LockfileSupplement.purls is a HashSet<PurlKey> built once, so the
  lockfile-only predicate is one hash lookup instead of re-keying the
  whole set on every miss.
- Ledgers::hosted_vendored_overlap deduplicates by PurlKey, so two
  spellings of one release give one takeover warning.
- get's hosted-claim set (rebased onto #940's new code) is a
  HashSet<PurlKey>; the new gem takeover pin lookup uses PurlKey::same.
- composer_version: pin that the sentinel-free key PurlKey uses never
  lets a rejected spelling collide with an accepted one, and document it.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This was referenced Oct 7, 2026
Compare purls through one PurlKey type #1045
Merged
Move all yarn.lock parsing into formats/yarn and stop pinning non-registry copies #1057
Merged
Mikola Lysenko (mikolalysenko) pushed a commit that referenced this pull request Oct 7, 2026
@claude
Merge origin/main into arch-fix/sec-credentials
ee87b33
Merges cleanly; additionally routes the yarn berry url-copy VEX
justification (added on main in #940) through redact_url so a
credentialed tarball URL never reaches the published VEX document.

Co-Authored-By: Claude <[email protected]>
Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 7, 2026
@mikolalysenko @claude
Key scan GC, lockfile-only and overlap sets by PurlKey
5953eb1
- `scan --prune --dry-run` previewed the vendor GC's manifest drop with a
  qualifier-strip relation while the wet pass used PurlKey, so NuGet case,
  PEP 503 and composer padding variants were pruned for real but not in
  the preview. Both now call vendor::unused_vendored_manifest_keys.
- LockfileSupplement.purls is a HashSet<PurlKey> built once, so the
  lockfile-only predicate is one hash lookup instead of re-keying the
  whole set on every miss.
- Ledgers::hosted_vendored_overlap deduplicates by PurlKey, so two
  spellings of one release give one takeover warning.
- get's hosted-claim set (rebased onto #940's new code) is a
  HashSet<PurlKey>; the new gem takeover pin lookup uses PurlKey::same.
- composer_version: pin that the sentinel-free key PurlKey uses never
  lets a rejected spelling collide with an accepted one, and document it.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator Author

bugbot run

cursor[bot] reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 7, 2026
@mikolalysenko @claude
Merge origin/main into arch-fix/vex-false-attest
aeddea4
Resolve conflicts in vex/discover: keep main's same-lock contest
(#940) alongside this branch's unwired-copy unattestation, pnpm bundled
copies and berry registry-locator contest.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
cursor[bot]
cursor Bot reviewed Oct 7, 2026
View reviewed changes

@cursor cursor Bot left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit acbac79. Configure here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 7, 2026
Yarn classic VEX attests not_affected while a bundled copy of the patched package@version stays unpatched (yarn.lock has no inBundle, so the #325 fix can't see it) #758
Closed
Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 7, 2026
@mikolalysenko @claude
Document shadowing of pins beside same-lock unpatched copies
9a8e2f1
After merging main's #940 same-lock unpatched-copy contest into the
#828 shadowing, a pin withheld because a pnpm file: dir/tarball, a yarn
classic registry/file: block, or a berry other-name file:/url copy
installs beside it is shadowed and restored like any other pin. Extend
the CLI contract sentence that only named bundled, git and
hasShrinkwrap-nested copies.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator Author

[agent] Merged at acbac79 (merge commit c5be5d1). Wrap-up:

  • Conflicts: none. I merged main into the branch after Fix main CI red on stale digest pending-list entries #1016 landed (869c81f). A maintainer then merged main again (acbac79). The PR diff stayed limited to vex/discover/{mod,npm,yarn}.rs, the golden harness and redirect-npm.json.
  • Local checks: clippy on socket-patch-core with -D warnings was clean. All 5594 socket-patch-core lib tests passed on acbac79, including the digest guard.
  • CI on acbac79: the CI, Gradle, PDM, Pipenv, Go, Composer, sbt, npm and pnpm workflows passed. One red job: vlt / native (ubuntu-latest, 1.0.10), cell hosted-two-versions. Its capture shows redirect_vlt_artifact_unverifiable … fetch error error sending request against patch.socket.dev. That's a network flake, and this PR doesn't touch vlt or redirect code. The vendored and agent cells for the same fixture passed. The Bun and vlt runs were still queued when the PR merged.
  • Bugbot: reviewed acbac79 and found no new issues.

Generated by Claude Code

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 9, 2026
Fix yarn classic copies locked under another name (#1236) #1242
Merged
2 of 3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@cursor cursor[bot] cursor[bot] left review comments
@Tanmay182003 Tanmay Singla (Tanmay182003) Tanmay182003 approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Yarn classic VEX attests not_affected when yarn.lock also has a registry block for the patched name@version (e.g. after yarn add -W <pkg> --exact), though yarn installs only the unpatched registry copy

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@mikolalysenko @Tanmay182003 @claude
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.