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 — Guard .socket links and agent writes with one containment helper by mikolalysenko · Pull Request #1042 · SocketDev/socket-patch

Conversation

@mikolalysenko

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

Uh oh!

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

Copy link
Copy Markdown
Collaborator

Fixes #726
Refs #887 (the delete-through is fixed; the vendor --check half is not, see Deferred)

Problem

The architecture audit found that symlink and write containment is decided in several places, each with its own rule:

  • B08 / Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887: the .socket link guard covered only deletes, and it started below .socket. In socket_dir.rs the walk was take_while(*a != stop_dir), and vendor_dir_symlink started at .socket/vendor. If two projects share one .socket through a link, a vendored write or revert in one project writes to, or deletes, the other project's units and state.json, and still exits 0.
  • B24 / get writes a patch view's blobs under their claimed hash without checking the content, overwriting already-verified blobs in place #726 (C42): get and agent-mode scan wrote inline blobContent with an in-place tokio::fs::write. The bytes were never hash-checked, and a committed .socket/blobs or .socket/blobs/<hash> symlink sent them outside the project.
  • B23: a new-file entry (empty beforeHash) silently overwrote an existing file with different content, even under --strict. CLI_CONTRACT's mismatch policy says it should not.
  • B25: the agent-mode guard against writing through links was a denylist of three known stores. A Composer path repository (vendor/<ns>/<name> symlinked to first-party source), a flit --symlink package, or any directory linked out of the package was patched in place.

Change

  • One containment helper, socket_patch_core::utils::containment:
    • linked_level / ensure_unlinked lstat every level below a root, the leaf included.
    • try_linked_level is the fallible version. It returns lstat errors other than NotFound instead of treating them as "not a link".
    • is_link is the only lstat link predicate. utils::fs::is_symlink and fs::first_symlink now delegate to it.
    • nearest_socket_dir / socket_project_root.
    • resolves_within checks canonical containment.
  • Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887. The guard now starts at the project root, so .socket itself is checked:
    • vendor_dir_symlink reports a linked .socket, so every vendored write and revert refuses with vendor_dir_symlink_unsupported.
    • remove_tree_and_prune, remove_file_and_prune and write_json_ledger refuse before they write or delete. write_json_ledger covers the vendored ledger and the pre-v5 hosted redirect ledger.
    • Agent-mode state (manifest.json, blobs/) under a linked .socket keeps working. A shared agent manifest is coherent, and refusing it at lock time would need a maintainer decision.
  • get writes a patch view's blobs under their claimed hash without checking the content, overwriting already-verified blobs in place #726 / B24. New function blob_fetcher::store_verified_blob:
    • It refuses a linked level and verifies the git-sha256 against the blob's name before writing anything.
    • It leaves an existing entry untouched if it already verifies.
    • It writes to a stage file and renames it into place.
    • get.rs::write_blob_entry now calls it. The streaming download writer (stream_cache_entry_atomic) applies the same link guard and the same hash rule. These are still two writers: one stages from bytes in memory, the other streams a response body. They share the guard, the hash check and the stage prefix, but each keeps its own stage-and-rename code.
    • The hand-rolled base64 decoder is deleted in favour of the base64 crate. The pinned "Invalid base64 character" message is kept.
  • B23. The apply engine treats a new-file collision as a HashMismatch with an empty expected_hash:
    • --strict refuses it.
    • The default policy overwrites it and emits content_mismatch_overwritten.
    • Verbose apply prints expected: (new file) for it.
  • B25. shared_store now checks containment, not only the known store markers:
    • Every directory a patch writes into must resolve inside the package directory.
    • A Composer package (identified by <vendor-dir>/composer/installed.json) must resolve inside its vendor dir.
    • Anything else is refused as OutsideInstallTree by apply and by rollback. The rollback refusal has its own remedy ("restore that source from version control") instead of "patch that source directly".
  • Recovery stays fail-closed. group_commit::recover uses try_linked_level. A journaled path whose level cannot be probed (EACCES, ENOTDIR) keeps the journal and errors, as the deleted crosses_symlink did.

Duplicates deleted

The "is any level below the root a link" cursor walk had 9 hand-rolled copies before this PR:

  • socket_dir::linked_level
  • the loop in vendor::path::vendor_dir_symlink
  • group_commit::crosses_symlink
  • group_commit::is_symlink
  • 2 loops in vendor::redownload
  • vendor::pypi_hatch's wheel-pin walk
  • 2 loops in vendor::reuse
  • vendor::bun_binary's workspace-tarball walk

After this PR, 8 of them route through containment::linked_level / try_linked_level. The one left is bun_binary.rs, which belongs to the bun session's files (#1009); see Deferred.

The lstat link predicate had 3 implementations (fs::is_symlink, group_commit::is_symlink, and the inline check in first_symlink) and now has 1, containment::is_link.

Also deleted: socket_dir's private nearest_socket_dir (it now lives only in containment) and the hand-rolled base64 decoder.

Behavior changes

  • Linked .socket: a project whose .socket is a symlink can no longer vendor, revert vendored units, or write the vendored ledger or the pre-v5 hosted redirect ledger. It gets vendor_dir_symlink_unsupported or a refusal. Agent mode is unchanged.
  • Blob and diff downloads: a linked .socket/blobs or .socket/diffs, or a linked .socket/blobs/<hash> entry, is refused. This affects agent-mode get, apply, repair and rollback. The blob is reported failed, and nothing is written at the link target. A user who pointed .socket/blobs at a shared cache must replace the link with a real directory.
  • Inline blobs in get: an inline blob whose bytes do not hash to its name fails the patch with content hash mismatch before anything is written.
  • New-file collision: reported as a mismatch overwrite by default, and refused under --strict.
  • Out-of-tree packages: agent-mode apply and rollback refuse a Composer path-repo package, a directory linked out of the package, and a package a package manager links into site-packages from its own prefix (Homebrew's Cellar, the Nix store). A file that an older socket-patch patched in place there can no longer be rolled back by socket-patch. The refusal says to restore it from version control.

All of these are documented in the new CLI_CONTRACT section "Links under .socket/ and write containment" and in docs/ecosystems.md.

Testing

All runs were local on macOS (rustc 1.93.1), through the shared heavy-job limiter with CARGO_INCREMENTAL=0 -j4.

  • Clippy: cargo clippy --workspace --all-features -- -D warnings -A unused_variables is clean. The -A is needed because python_crawler.rs:2734 has an unused variable that only fires on macOS and already fails on main; CI's Linux clippy does not hit it. --all-targets reports nothing in the lines this PR changed; its remaining errors are in test code and already fail on main.
  • Core lib: cargo test -p socket-patch-core --lib: 5586 passed, 1 failed. The failure is utils::digest::tests::production_digests_go_through_the_helpers, a stale PENDING_INLINE_DIGESTS list on this branch's base that Fix main CI red on stale digest pending-list entries #1016 has since fixed on main. It is unrelated to this PR.
  • CLI: cargo test -p socket-patch-cli --no-fail-fast, every target including --lib: 199 of 202 targets pass, and the --lib target passes 865/865. After the tests/get/ fixture fix, --test get passes 81/81 and --test in_process_get_corrupt_manifest passes. The other two failures are not caused by this PR:
    • e2e_vendor_cargo_build::cargo_vendored_manifest_patch_builds_on_old_toolchains cannot run here: the x86_64 rustup 1.41 toolchain gives "Bad CPU type in executable" on this arm64 machine without Rosetta.
    • mode_migration_npm::berry_vendored_then_hosted_takeover_leaves_pure_hosted fails the same way at this branch's merge-base (db83f01) with none of this PR's changes. I checked that in a separate worktree.
  • Regression tests (failing first):
    • containment::*, including try_linked_level_propagates_unprobeable_levels
    • group_commit::recovery_fails_closed_when_a_level_cannot_be_probed
    • blob_fetcher::download_refuses_a_linked_blobs_dir_or_entry: the download path, with a linked .socket/blobs and a dangling .socket/blobs/<hash>
    • socket_dir::a_linked_socket_dir_is_never_written_or_deleted_through (Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887)
    • vendor_dir_symlink_finds_the_outermost_linked_level
    • write_blob_entry_verifies_content_against_its_hash and write_blob_entry_refuses_a_linked_blob_or_blobs_dir (get writes a patch view's blobs under their claimed hash without checking the content, overwriting already-verified blobs in place #726)
    • write_all_patch_blobs_unwinds_its_own_blobs_on_a_later_failure and write_all_patch_blobs_unwind_spares_preexisting_blobs, which now use real hashes so the unwind is actually exercised
    • test_apply_package_patch_new_file_collision_refused_under_strict (B23)
    • expected_hash_label_names_a_new_file_collision
    • composer_path_repository_is_outside_the_install_tree, which also checks the rollback remedy text, and written_dir_linked_out_of_the_package_is_refused (B25)
  • Fixtures: every CLI fixture that named an inline blob with a fake hash (1111…, 0000…) now uses the real git-sha256. This covers the top-level in_process_* and covgap files, tests/get/, and in_process_get_corrupt_manifest. I checked the Linux-only docker_e2e_* and e2e_* mock servers by reading them: they already compute git_sha256 of their content.
  • Left to CI: the Linux, Windows and Docker suites. On Windows, junction handling depends on FileType::is_symlink, which the old guards also relied on.

Deferred

  • Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887, vendor --check: it still exits 0 (discovered: 0) when the shared ledger is gone but the lock is still wired to a missing artifact. Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887 stays open for that half.
  • A linked .socket itself: it still redirects agent-mode blob and manifest writes, because the cache guard's root is .socket. Refusing it for every command at lock time, as audit B08 recommended, would break a shared agent manifest. That needs a maintainer decision; I did not make it. CLI_CONTRACT states the gap.
  • Two blob writers: store_verified_blob and stream_cache_entry_atomic still each have their own stage-and-rename code. Merging them into one commit helper is possible but was left out of this PR.
  • vendor::bun_binary's workspace-tarball walk: the last hand-rolled link walk. It is in the bun session's files (Fix open bun issues (#992, #861, #784, #764, #735, #635, #599, #578, #497, #443, #371) #1009), so I did not edit it there. It can call containment::try_linked_level once Fix open bun issues (#992, #861, #784, #764, #735, #635, #599, #578, #497, #443, #371) #1009 lands.
  • B23, second half: a pre-image store. Rolling back an added file still deletes it, and the content it replaced is not kept. This needs a manifest field (roadmap item 17, C24/Decide: make --download-mode file the default and retire the diff download path #792).
  • With Bun's globalStore (Bun ≥ 1.3.14), agent mode patches and rolls back every other project sharing the store, and vex attests unpatched transitive copies as not_affected #635 (Bun globalStore): the bun session has claimed it.
  • Composer crawler: resolve_install_path still checks containment lexically. The write guard covers it at apply time.

🤖 Generated with Claude Code


Note

High Risk
Changes security-sensitive filesystem behavior (blob cache, vendor ledger, in-place apply/rollback) and tightens failure modes for symlinked project layouts; mis-detection could block legitimate installs or leave edge cases unguarded.

Overview
Centralizes symlink and install-tree containment in utils::containment, then routes blob writes, .socket deletes/ledgers, vendor paths, and group-commit recovery through it so writes and deletes never follow a linked .socket, blobs/, or vendor tree (#887, #726).

Agent-mode get now stores inline blobContent via store_verified_blob: git-sha256 must match the blob name, linked cache paths are refused, existing verified blobs are left alone, and bytes are staged-and-renamed (downloads get the same link guard). Apply treats “patch adds file but path already has other content” like any content mismatch (content_mismatch_overwritten by default, hard error under --strict; verbose output shows expected: (new file)). Apply/rollback also refuse packages whose directories resolve outside the install tree (Composer path repos, symlinked editable installs, etc.), with rollback pointing users at version control.

Docs (CLI_CONTRACT.md, docs/ecosystems.md) and tests are updated for the new rules; inline blob fixtures use real hashes; get’s base64 decode uses the base64 crate while keeping the pinned invalid-character error text.

Reviewed by Cursor Bugbot for commit 9927715. Configure here.


Generated by Claude Code

Sorry, something went wrong.

Uh oh!

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

All reactions
Mikola Lysenko (mikolalysenko) and others added 5 commits October 7, 2026 10:31
@mikolalysenko @claude
Guard .socket itself against links in one containment helper (#887)
81a493e
Add utils::containment: linked_level (lstat each level below a root,
the leaf included), ensure_unlinked, is_link, nearest_socket_dir and
resolves_within. It replaces the four hand-rolled level walks:
socket_dir::linked_level, the loop in vendor::path::vendor_dir_symlink,
group_commit::crosses_symlink/is_symlink and the two cursor loops in
vendor::redownload.

The guard now starts at the project root, so a linked .socket is a
guarded level (#887): vendor_dir_symlink reports it, so every vendored
write and revert refuses with vendor_dir_symlink_unsupported, and
remove_tree_and_prune, remove_file_and_prune and write_json_ledger
refuse before deleting or writing through it. Agent-mode state
(manifest, blobs) under a linked .socket keeps working; only the
project-specific vendored and hosted ledgers and units are refused.

Audit B08.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Store inline blobs through one verified, link-refusing writer (#726)
e59ab21
get/scan wrote a patch view's inline blobContent with an in-place
tokio::fs::write: no hash check, and a committed .socket/blobs or
.socket/blobs/<hash> symlink redirected the bytes out of the project
(audit B24, C42).

Add blob_fetcher::store_verified_blob: refuse a linked level (via
utils::containment), verify the git-sha256 against the name, leave an
existing verified entry untouched, then stage and rename. get.rs's
write_blob_entry calls it; the download path checks the same link
guard. The hand-rolled base64 decoder is replaced by the base64 crate
(padding-indifferent, line breaks stripped), keeping the pinned
invalid-character message.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Treat a new-file collision as a content mismatch (audit B23)
52ba157
A patch entry with an empty beforeHash whose path already holds other
content was overwritten silently, even under --strict, contrary to
CLI_CONTRACT's mismatch policy. The apply engine now marks it a
HashMismatch (expected_hash empty): --strict refuses it and leaves the
file, the default overwrites it with the content_mismatch_overwritten
warning. verify_file_patch itself is unchanged for its other callers.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Refuse agent writes that leave the install tree (audit B25)
7feee1c
The agent-mode write guard only knew three stores by marker. Add a
containment rule on top: every directory a patch writes into must
resolve inside the package directory, and a Composer package
(<vendor-dir>/<ns>/<name> with composer/installed.json) must resolve
inside its vendor dir. A Composer path repository's symlink into
first-party source, a flit --symlink package, or any directory linked
out of the package is refused (OutsideInstallTree) by apply and
rollback alike. The rollback test that deleted a file through a link
out of the package now expects the refusal.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Document the .socket link guard, new-file mismatch and install-tree c…
8ca6bb7
…ontainment

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko Mikola Lysenko (mikolalysenko) added the arch-refactor PR opened by the scheduled architecture refactor routine label Oct 7, 2026
Mikola Lysenko (mikolalysenko) and others added 4 commits October 7, 2026 11:54
@mikolalysenko @claude
Use real git-sha256 names for inline blob fixtures
9913f78
Inline blobs are now verified against their name before they are
stored (#726), so the CLI fixtures that named "patched\n" 1111…1 and
"original\n" 0000…0 use the real hashes.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Route the remaining link walks through containment
38dfe07
pypi_hatch's wheel-pin walk and both committed-artifact walks in
vendor::reuse were still hand-rolled copies of "is any level below the
root a link"; they now call containment::linked_level /
try_linked_level. reuse keeps its Missing / Unreadable outcomes with
one probe of the leaf after the link check.

fs::is_symlink and fs::first_symlink now delegate to containment::is_link,
so one lstat rule decides what counts as a link.

try_linked_level is the fallible twin of linked_level: an lstat error
other than NotFound (EACCES, ENOTDIR) is returned instead of being read
as "not a link". group_commit::recover uses it, which restores the
fail-closed behavior of the deleted crosses_symlink: a journaled path
whose level cannot be probed keeps the journal and errors, rather than
replaying around it. Regression test included.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Test the download link refusal and fix the remaining blob fixtures
dd7e67c
A new blob_fetcher test drives fetch_blobs_by_hash against a linked
.socket/blobs and a dangling .socket/blobs/<hash> link: the blob is
reported failed and nothing lands at the link target.

The write_all_patch_blobs unwind tests named their blobs with fake
hashes, so since inline blobs are hash-checked they failed on the first
entry and no longer tested the unwind. They now use real git-sha256
names, with a separate "pristine" before-blob, so the after-blob really
lands before the traversal before-hash fails.

The get/ module fixtures (get_invariants, get_update_summary_e2e) and
in_process_get_corrupt_manifest still named "patched\n" 1111... and
"original\n" 0000...; they use the real hashes now.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko @claude
Document the link refusals and give rollback its own remedy
9a0ca84
An outside-install-tree refusal told a rollback to "patch that source
directly". Rollback now says to restore the source from version
control. ecosystems.md notes that a package a package manager links
into site-packages from its own prefix (Homebrew, Nix) is refused the
same way.

CLI_CONTRACT gains a section on links under .socket/: the blob and
diff download refusal, the inline-blob hash check in get, the ledger
refusal under a linked .socket (including the pre-v5 hosted redirect
ledger), the outside-install-tree refusal in apply and rollback, and
the known gap that a linked .socket itself still redirects agent-mode
blob and manifest writes.

Verbose apply prints "(new file)" instead of an empty expected hash
for a new-file collision.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko
Mikola Lysenko (mikolalysenko) marked this pull request as ready for review October 7, 2026 17:01
Tanmay182003
Tanmay Singla (Tanmay182003) approved these changes Oct 7, 2026
View reviewed changes
@mikolalysenko Mikola Lysenko (mikolalysenko) added the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 7, 2026
@mikolalysenko

Mikola Lysenko (mikolalysenko) commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator Author

Ready for review at head 9a0ca84688aa87068db2340332a559e638b9302e.

  • CI: 299/299 check runs finished, 296 passed and 3 skipped by design, 0 failing. The earlier sbt image-load failures went green on rerun.
  • Bugbot: reviewed this head with no findings. There are no unresolved review threads.
  • Mergeability: mergeable with no conflicts. The branch is 19 commits behind main, but it was not re-merged, because that would restart the full CI matrix during the runner backlog.
  • Reviewer focus: utils::containment is now the one symlink and containment guard. Check that the .socket guard now starting at the project root refuses shared-.socket vendored writes and keeps agent-mode state working. Also check the B23 behavior: a new-file collision now counts as a hash mismatch, which --strict refuses.

Slack announcement not sent: the Slack send tool was unavailable to this run.


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) enabled auto-merge October 7, 2026 19:52
@claude
Merge remote-tracking branch 'origin/main' into arch-fix/socket-dir-s…
9927715
…ymlink
@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.

@mikolalysenko Mikola Lysenko (mikolalysenko) removed the Ready for review Agent-verified: mergeable, CI green, Bugbot clean — awaiting human review label Oct 7, 2026
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 9927715. Configure here.

Sorry, something went wrong.

Uh oh!

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

All reactions
@mikolalysenko
Mikola Lysenko (mikolalysenko) added this pull request to the merge queue Oct 7, 2026
Merged via the queue into main with commit ddc3bfb Oct 8, 2026
561 of 564 checks passed

Uh oh!

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

@mikolalysenko
Mikola Lysenko (mikolalysenko) deleted the arch-fix/socket-dir-symlink branch October 8, 2026 01:18
Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 8, 2026
@mikolalysenko @claude
Merge origin/main into arch-fix/takeover-atomic
c166766
Resolve conflicts with main's #946 (PyPI takeover pre-gate), #1042
(containment helper) and #1077 (classic berry-migration warning):

- hosted.rs: keep this PR's staged takeover; main's new
  `preflight_pypi_takeover` pre-gate inside the deleted
  `vendored_takeover` is dropped. The staged takeover's `explain` now
  calls `preflight_pypi_takeover` (instead of only the requirements
  check), so a retracted uv pin-down (#723) or Poetry 0.x (#945)
  takeover is still skipped with `redirect_uv_takeover_version_unreachable`
  / `redirect_poetry_lock_unsupported`, as main's tests expect.
- socket_dir.rs: use main's `containment::ensure_unlinked` guard, then
  this PR's deferred removal.
- redirect/mod.rs: take main's `pinned_any` (a mirror-refused entry
  counts only when it already carries our hosted pin), which subsumes
  this PR's mirror fix.
- CLI_CONTRACT.md: describe the uv/Poetry cases as retractions.
- mode_migration_pypi.rs: keep both sides' tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Mikola Lysenko (mikolalysenko) added a commit that referenced this pull request Oct 8, 2026
@mikolalysenko @claude
Merge origin/main into arch-fix/purl-key
f7c4188
Resolve conflicts against main's rustfmt pass and the containment-helper
refactor (#1042): keep main's formatting, drop the removed `canon` /
composer-identity helpers in favour of PurlKey, and route main's new
apply-failure purl matching in get.rs (#955) through PurlKey::qualified /
PurlKey::same so it agrees with the rest of the purl identity.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 8, 2026
apply, apply --check and vendor report noManifest (exit 0) when .socket/manifest.json exists but can't be stat'd #998
Closed
4 tasks
Mikola Lysenko (mikolalysenko) pushed a commit that referenced this pull request Oct 8, 2026
@claude
audit-core: C42 fixed, C60 partly fixed (#1042); file C75 (#1107); re…
ebeffc9
…fresh Parts 7-8 and §0

Assisted-by: Claude Code:claude-opus-5-5
@mikolalysenko Mikola Lysenko (mikolalysenko) mentioned this pull request Oct 8, 2026
Vendored mode still writes and deletes through a symlinked .socket dir: the #664 guard checks .socket/vendor and below only, so rollback in one yarn berry project wipes another project's vendored tarball and ledger #887
Closed
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

arch-refactor PR opened by the scheduled architecture refactor routine

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

get writes a patch view's blobs under their claimed hash without checking the content, overwriting already-verified blobs in place

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.