Skip to content

fix(core): complete Unix quarantine hardening and foreign-entry identity proof (#445) - #1073

Merged
qnbs merged 3 commits into
mainfrom
feat/445-gate4e-h1a2-unix-hardening-successor
Oct 15, 2026
Merged

qnbs merged 3 commits into
mainfrom
feat/445-gate4e-h1a2-unix-hardening-successor

Conversation

@qnbs

@qnbs qnbs commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

User description

What this is

A clean successor of #1072, which is superseded and not merged. #1072 reached 15 of 15 commits (budget SATURATED) with two valid P2 findings still open, so it cannot take a 16th commit. This PR has two commits on main (45ce3d0c): the substantive successor commit 8f8c9883 carries the reviewed net tree of #1072 (head ae96312f) plus the fixes for those two findings, and the second commit 99336659 updates only the CHANGELOG PR reference. Commit-signature verification remains a CI gate. #1072 stays frozen until this PR is integrated; no history was rewritten.

test-support only: the primitives exist only with the test-only feature and have no caller. No new unsafe, no new package. Slice H1a-2, part of #359 (Linear QNB-168).

The two findings open on #1072, and how they are closed here

  1. CHANGELOG overstates the cleanup (Codex P2). remove_if_named checks the identity and then calls unlinkat by name, so a swap between the two can still remove an empty replacement directory. The entry now says the check narrows the race and does not close it (rmdir takes a name; a lost race removes at most an empty directory), and that retained-entry detection is a look at a name that detects after the fact.
  2. Foreign entry carried no identity (Codex P2). Inside::Foreign was passed as swapped(None), so holds(None) accepted any object at x. A link, directory, FIFO or inaccessible file now carries the identity it was seen with (a look that does not follow a link). An identity that cannot be taken is a failed inspection, not a retained entry, so an unobservable state earns no unproven success.
    • remove_unix_sync.rs, scene ForeignReplaced: a directory takes the name, the name is taken again so the put-back is blocked, and the entry is replaced after the inspection (run at the sync of the quarantine directory, the one point between inspection and check that a test can reach). Result: Disturbed.
    • Control ForeignKept: the same entry left untouched stays Swapped { restored: false }.
    • Mutation-checked: passing no identity makes ForeignReplaced return Swapped { restored: false }, with the foreign object still in x.

What the net state contains (from #1072)

  • The quarantine directory is synced after the rename was tried, in every path that moves an entry through it, including an entry an actor removed again. The rename alone decides restored; a sync that fails after a rename that worked is an error after the parent was synced, and a removal becomes Removed(NotConfirmed). It never turns into a false Disturbed or Stranded.
  • A failed setup is cleaned up only after an identity check, shared with discard().
  • Tests: remove_unix_sync.rs, remove_unix_cleanup.rs, evidence document and CHANGELOG say what the tests pin.

Limits, stated

  • An fsync error on a directory cannot be provoked portably; the failing-sync cases use a small cfg(test) seam that models the error. No crash is simulated.
  • The call in Quarantine::create that reaches the cleanup is not forced end-to-end (it needs a changed process umask); the shared function is tested directly.
  • Unchanged and not accepted for production: the unlinkat(name) race against a same-user actor and the link-count heuristic. They stay owner-gated before any production reclamation (H1b), see Desktop fs-data key-rotation migration is not crash-resumable (mixed-key state possible) #359.

Local evidence, hosted CI and review pending

cargo fmt --check; cargo clippy --all-targets -D warnings on the host and compile-only for aarch64-apple-darwin; the pinned:: unit tests on Linux; pnpm run ci:prepush (canonical wrapper) after deps:reconcile; pr:budget against main: CAUTION, OK on the initial substantive commit; GitHub currently reports 2 commits (the second is CHANGELOG-only). Hosted Windows/macOS/Ubuntu evidence, CI, CodeQL and independent review for this head are pending; nothing from #1072 carries over.

Part of #359.

Summary by Sourcery

Harden test-support Unix quarantine removal by verifying foreign-entry identity and quarantine durability before reporting outcomes.

Bug Fixes:

  • Detect tampering or unprovable state when entries in the Unix quarantine directory are replaced, removed, or become inaccessible after inspection.
  • Prevent cleanup from removing a different quarantine directory that has taken over the original name.

Enhancements:

  • Require synchronization of both the parent and quarantine directories before confirming Unix removals, while reporting failed quarantine syncs conservatively.
  • Record identities for foreign quarantine entries so retained-entry outcomes are only reported when their location can be verified.
  • Fail closed when quarantine directories cannot be inspected and preserve failure or tampering outcomes without masking them with sync errors.

Documentation:

  • Update the Unix removal durability and race-handling evidence and changelog to document the strengthened guarantees and remaining limitations.

Tests:

  • Add Unix tests covering quarantine synchronization, failed syncs, foreign-entry replacement, cleanup identity checks, inaccessible directories, and tampering scenarios.

Summary by cubic

Hardens the Unix quarantine-based file removal against a same-user actor in the quarantine directory, closing the two open findings on #1072 and two more found on the first commit of this PR. Test-support only, with no caller, no new unsafe, and no new package.

  • The quarantine directory an entry moved through is now synced and counts toward durability: a removal is Removed(Confirmed) only when both the parent and that directory synced, and a failed sync is an error, never Disturbed or Stranded.
  • A foreign entry (link, directory, FIFO, inaccessible file) carries the identity it was seen with, so an actor that replaces it after inspection and blocks the put-back gets Disturbed, not Swapped { restored: false }. The identity is a stat identity without a held handle since opening such entries has effects; a reused identity is not noticed, and this limit is stated in the docs rather than covered by a Linux-only mechanism.
  • A look at a retained entry that fails (a search permission lost after the move) no longer counts as "the entry is there": Disturbed is returned because an outcome that says where an entry is needs a proof, which is why the Stranded case is proved separately without permissions.
  • remove_if_named removes the quarantine directory only when the name still leads to the directory that was created, and the changelog no longer overstates the name-based cleanup: the identity check narrows the rmdir race and does not close it.
  • remove_unix_sync.rs and remove_unix_cleanup.rs pin each case, with the failing-sync cases using a cfg(test) seam since an fsync error on a directory cannot be provoked portably.

Written for commit 1602d79. Summary will update on new commits.

View guided diff Turn on auto-fix


CodeAnt-AI Description

Harden test-support Unix file removal against changes to its temporary holding area

What Changed

  • Unix removals sync the temporary holding area as well as the parent directory. If syncing fails, a removal is marked unconfirmed; failures after an entry is put back, kept aside, or found missing are reported instead of treated as successful outcomes.
  • If an entry held aside is replaced before it can be restored, removal reports tampering rather than claiming the entry is still safely retained.
  • Cleanup leaves a replacement directory untouched when its name no longer points to the directory created for the removal.

Impact

✅ Unix removals confirmed only after both directories are synced
✅ Replaced held entries detected as tampering
✅ Replacement directories left untouched

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Summary by CodeRabbit

  • Security

    • Unix file removal checks quarantine-directory and entry identities before cleanup, and refuses to proceed if the quarantine directory cannot be opened.
    • Cleanup leaves unrelated or nonempty quarantine contents untouched.
  • Reliability

    • Removal syncs the relevant directories; failed syncs can result in an unconfirmed outcome rather than confirmed removal.
    • Recovery outcomes distinguish entries that are restored, retained, missing, or disturbed when their location cannot be verified.

… the quarantine directory (#445)

Clean successor of #1072 (head ae96312, 15 of 15 commits, budget SATURATED):
the reviewed net state of that PR plus the two findings that were still open
on it. test-support only, no caller, no new unsafe, no new package.

Carried from #1072: the parent is synced after a rollback, a stranded entry, a
put-back and a vanished name; the quarantine directory an entry moved through
is synced too, and a sync of it that fails is an error after a put-back, a kept
entry or an entry an actor removed again and makes a removal NotConfirmed,
never another outcome; the rename alone decides `restored`; the quarantine
directory is removed by its name only after an identity check, also when its
setup fails; an entry is reported as retained only if the recorded name still
leads to its directory, otherwise Disturbed; a quarantine directory that cannot
be opened is refused.

Fixed on top of it:
- A foreign entry (link, directory, FIFO, inaccessible file) carries the
  identity it was seen with (a look that does not follow a link), as an opened
  object does, so an actor that replaces it after the inspection while the
  put-back is blocked gets Disturbed instead of Swapped { restored: false }.
  An identity that cannot be taken is a failed inspection and not a retained
  entry, so an unobservable state earns no unproven success. The test replaces
  the entry at the sync of the quarantine directory, the one point between the
  inspection and the check that a test can reach, and a control leaves the
  same entry untouched (it is still kept).
- The changelog no longer says the name-based cleanup removes "only if" the
  name leads to the directory that was created: the check narrows the race and
  does not close it, as the code and the evidence document already said.

Mutation-checked, each caught: passing no identity for a foreign entry, plus
the mutations recorded on #1072 for the sync, the identity comparison and the
vanished-entry paths. The failing-sync cases use a small cfg(test) seam that
models the error; no crash is simulated. Issue #359. The PR number in the
changelog entry is to be set to the number of this PR when it is opened.
@sourcery-ai

sourcery-ai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Sorry @qnbs, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 1 day and 12 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@vercel

vercel Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
worldscript-studio Ready Ready Preview Oct 15, 2026 10:30pm UTC

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-15T22:33:50.293604Z 1602d79 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@codeant-ai

codeant-ai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Reviewed your PR 8f8c988 Oct 15, 2026 · 21:53 22:00

@codeant-ai

codeant-ai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@sourcery-ai

sourcery-ai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Reviewer's Guide

Completes the Unix quarantine hardening by synchronizing every directory affected by quarantine moves, making removal durability contingent on both directories, and requiring identity evidence for cleanup and retained foreign entries; extensive test-only seams and scenarios verify failure, tampering, and race-detection behavior while documenting the remaining name-based limitations.

Sequence diagram for hardened Unix quarantine removal

sequenceDiagram
    participant Caller
    participant ParentDir
    participant Quarantine
    participant Observer

    Caller->>ParentDir: renameat_with(..., RENAME_NOREPLACE)
    ParentDir-->>Caller: entry moved to quarantine
    Caller->>Quarantine: inspect(kind)
    Quarantine-->>Caller: Inside::Object or Inside::Foreign(identity)
    alt authenticated object
        Caller->>Observer: Observer(RemovalStage::BeforeUnlink)
        Caller->>Quarantine: unlinkat(x)
        Quarantine-->>Caller: removal result
        Caller->>Quarantine: sync()
        Caller->>ParentDir: sync()
        Caller-->>Caller: Removed(Confirmed or NotConfirmed)
    else foreign or swapped entry
        Caller->>Quarantine: restore()
        Caller->>Quarantine: sync()
        Caller->>ParentDir: sync()
        Caller-->>Caller: Swapped or Disturbed
    end
Loading

State diagram for Unix quarantine removal outcomes

stateDiagram-v2
    [*] --> MovedToQuarantine
    MovedToQuarantine --> Inspected
    Inspected --> Removed: authenticated object
    Inspected --> Restored: foreign identity matches after check
    Inspected --> Stranded: restore failed and retained identity is proven
    Inspected --> Disturbed: recorded quarantine or entry identity no longer matches
    Inspected --> Vanished: entry is gone
    Removed --> ParentSynced
    Removed --> NotConfirmed: quarantine sync failed
    Restored --> ParentSynced
    Stranded --> ParentSynced
    Vanished --> ParentSynced
    ParentSynced --> [*]
Loading

Flow diagram for foreign-entry identity proof

flowchart TD
    A[inspect quarantine entry] --> B{Entry is foreign?}
    B -- no --> C[continue authenticated-object checks]
    B -- yes --> D["identity_from(stat without following link)"]
    D --> E{Identity available?}
    E -- no --> F[inspection failure; restore or strand]
    E -- yes --> G[restore]
    G --> H{Entry still has recorded identity?}
    H -- yes --> I[Swapped]
    H -- no --> J[Disturbed]
Loading

File-Level Changes

Change Details Files
Strengthen quarantine-directory durability handling across all Unix removal paths.
  • Track and sync the quarantine directory after moves, put-backs, removals, rollbacks, stranded entries, and actor-vanished entries.
  • Propagate sync failures without misclassifying swapped or tampered states; require both parent and quarantine syncs for confirmed removal.
  • Add test-only sync-failure injection and comprehensive outcome/durability coverage.
crates/worldscript-secure-storage/src/pinned/unix/removal.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix_sync.rs
crates/worldscript-secure-storage/src/pinned/removal.rs
Authenticate quarantine cleanup and retained foreign entries by filesystem identity.
  • Record the created quarantine directory identity and remove it by name only when the identity still matches.
  • Carry identity for foreign entries using non-following metadata and treat failed identity inspection as failure rather than proof of retention.
  • Detect renamed, removed, or replaced quarantine entries as Disturbed instead of reporting unproven success.
crates/worldscript-secure-storage/src/pinned/unix/removal.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix_cleanup.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix_sync.rs
Expand Unix hardening tests and update the documented contract and evidence.
  • Cover blocked put-backs, renamed or replaced quarantine directories, inaccessible quarantine directories, occupied cleanup directories, foreign-entry replacement, and identity-sensitive outcomes.
  • Update outcome documentation, changelog claims, and durable-evidence notes to state residual name-based races and sync semantics accurately.
crates/worldscript-secure-storage/src/pinned/tests/remove_unix.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix_cleanup.rs
crates/worldscript-secure-storage/src/pinned/tests/remove_unix_sync.rs
crates/worldscript-secure-storage/src/pinned/removal.rs
CHANGELOG.md
docs/native/r15/GATE4D-JOURNAL-DURABLE-EVIDENCE.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@codeant-ai

codeant-ai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

🏁 CodeAnt Quality Gate Results

Commit: 1602d79e
Scan Time: 2026-10-15 23:00:41 UTC

✅ Overall Status: PASSED

Quality Gate Details

Quality Gate Status Details
Secrets ✅ PASSED 0 secrets found
Duplicate Code ✅ PASSED 0.3% duplicated
SAST ✅ PASSED No security issues
Bugs ✅ PASSED Rating S: No bugs
IAC ✅ PASSED No IAC issues

View Full Results

@codeant-ai codeant-ai Bot added the size:XL This PR changes 500-999 lines, ignoring generated files label Oct 15, 2026
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

[check-pr-size] PR size is over the target tier (normal profile): 8 files, 1014 meaningful lines, 3 commits — limit ≤8 files / ≤400 lines / ≤6 commits. Consider splitting into smaller, independently reviewable PRs.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: qnbs/WorldScript-Studio/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 4a00cdeb-8fe9-4a71-961b-99713bc7edfc
📥 Commits

Reviewing files that changed from the base of the PR and between 9933665 and 1602d79.

📒 Files selected for processing: 5
  • CHANGELOG.md
  • crates/worldscript-secure-storage/src/pinned/removal.rs
  • crates/worldscript-secure-storage/src/pinned/tests/remove_unix.rs
  • crates/worldscript-secure-storage/src/pinned/unix/removal.rs
  • docs/native/r15/GATE4D-JOURNAL-DURABLE-EVIDENCE.md
🚧 Files skipped from review as they are similar to previous changes: 2
  • CHANGELOG.md
  • crates/worldscript-secure-storage/src/pinned/removal.rs

Included review availability: This review used your included allowance. 0 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

📝 Walkthrough

Unix authenticated-file removal now tracks quarantine and entry identities, syncs the quarantine directory alongside the parent, and maps sync and tampering conditions to explicit outcomes. Tests and documentation cover cleanup, replacement, rollback, stranded entries, and sync failures.

Changes: Unix removal hardening

Layer / File(s) Summary
Identity-bound quarantine cleanup
crates/worldscript-secure-storage/src/pinned/unix/removal.rs, crates/worldscript-secure-storage/src/pinned/tests/remove_unix.rs, crates/worldscript-secure-storage/src/pinned/tests/remove_unix_cleanup.rs
Quarantine cleanup checks that the name still identifies the created directory. Inspection records foreign-entry identity. Tests cover replacement and tampering of quarantine directories and entries, permission failures, and cleanup conditions.
Removal outcomes and directory durability
crates/worldscript-secure-storage/src/pinned/removal.rs, crates/worldscript-secure-storage/src/pinned/unix/removal.rs, crates/worldscript-secure-storage/src/pinned/tests/*, CHANGELOG.md, docs/native/r15/GATE4D-JOURNAL-DURABLE-EVIDENCE.md
Unix removal syncs the quarantine directory after relevant changes and uses both directory sync results when reporting durability. Rollback, stranded, vanished, and disturbed outcomes are covered by tests and documented alongside sync failures.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 1602d

No actionable issue is established for this change; it is mergeable after normal checks.

- [ ] Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

codescene-access[bot]

This comment was marked as outdated.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8f8c98830f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/worldscript-secure-storage/src/pinned/unix/removal.rs Outdated
Comment thread crates/worldscript-secure-storage/src/pinned/unix/removal.rs
@codeant-ai

codeant-ai Bot commented Oct 15, 2026

Copy link
Copy Markdown

CodeAnt PR Risk: Low Risk

  • The PR appears safe to merge; Unix removal now checks quarantine identities and accounts for syncing both directories.
  • Focused tests exercise tampering, rollback, cleanup, and sync failures, including cases where entries are replaced or moved.

Assessed commit: 9933665970c6

@codecov

codecov Bot commented Oct 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

… the limit of a foreign identity (#445)

Two findings on 8f8c988, both valid.

A look at the entry that failed (a search permission lost after the move) was
counted as "the entry is there", so a removal whose put-back was blocked
reported Stranded, and a kept foreign entry reported Swapped (restored false),
without having seen the entry (Codex P2). An outcome that says where an
entry is needs a proof, and a failed look proves nothing: it is now Disturbed.
The identity that is compared is no longer optional (the "any object counts"
path had no caller left), so there is no lenient path to fall into. The
Stranded case that is proved, with the name taken again, is unchanged and runs
for root as well; the permission case now expects Disturbed and still checks
that the entry is in fact the authenticated inode, which is why this is
conservative and not a claim that the directory was tampered with.

The identity of a foreign entry is a stat identity without a held handle (Codex
P2): a link, a FIFO or a device node is not opened, because opening has
effects, and no handle can be taken for every kind without them. A file system
may give the identity of a removed object to its replacement, which the check
cannot tell apart. This is stated where the outcome is described (the variant,
the Disturbed contract, the evidence document and the changelog) rather than
covered by a mechanism that would hold for Linux only; it is part of the
same-user residual that stays owner-gated before any production use.

Mutation-checked: counting a failed look as present fails the permission case.
test-support only, no caller, no new unsafe, no new package. Issue #359.

@codescene-access codescene-access Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Gates Passed
3 Quality Gates Passed

See analysis details in CodeScene

Quality Gate Profile: The Bare Minimum
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.

@qnbs

qnbs commented Oct 15, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

One request, after the rate-limit window: the last CodeRabbit review of this PR was on 99336659. 1602d79e changes the retained-entry check to fail closed (a failed look is no proof) and qualifies the foreign-entry identity; that delta has no CodeRabbit coverage yet.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

This branch was successfully deployed

1 active deployment
Preview — 1602d79e Deployed Oct 15, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL This PR changes 500-999 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant