Repository navigation
Conversation
11 tasks done
shahar1
marked this pull request as ready for review
October 25, 2026 06:53
potiuk
requested changes
Oct 25, 2026
potiuk
left a comment
Member
There was a problem hiding this comment.
Thanks, this is a clear improvement over the old cat/echo probes. A few of the new rules still let a false pass or false fail through; details inline. The first is the one that matters most.
shahar1
force-pushed
the
fix/verify-skill-accuracy
branch
from
October 26, 2026 03:57
20df286 to
457e09f
Compare
A verify run on a Linux host launched from an IDE extension, with the project settings only in settings.local.json, reported several checks as passing that proved nothing: - Check 1 read only the committed project file and never asked for sandbox.filesystem.denyRead. Without "~/" there, bubblewrap reads are deny-only and credential files stay readable. Check 1 now evaluates the merged project, project-local and user settings, requires the home denyRead entry, and names the file each key came from. - Check 7a treated bubblewrap's "No such file or directory" as a pass, which a missing file also prints. It now probes common credential paths with test -r and stat, never cat, and reports inconclusive until the user confirms from a terminal that one exists. - Check 7b echoed AWS_ACCESS_KEY_ID, which the reference sandbox.credentials already unsets, wrapper or not. It now lists variable names only, flags credential-shaped ones, and reports an IDE CLAUDE_CODE_ENTRYPOINT as a warning, since such a session never went through claude-iso. The clean-env wrapper doc says so too. - Checks 5, 10a and 13c compare against a framework checkout the skill never located. A pre-flight now finds it, and reports those comparisons as unchecked when there is none. - Check 10 ran the touch-overlay sub-checks for any signed commit. They now apply only to a hardware key; 10c still applies to every ssh-format key. - Sandbox /dev/null placeholders (character special 1,3) looked like empty untracked files. The verify and doctor skills now say how to recognise them and to take host state from git or the user. The mirrored prompt in secure-agent-setup.md is kept in sync, and the step-1-classify eval suite gains four cases for these verdicts. Generated-by: Claude Code (Claude Opus 5.5)
Check 10 counted a key as hardware only for an sk- public key or an OpenPGP-format card. ssh-format signing through gpg-agent uses the card's aut slot and shows a plain ssh-ed25519 or ssh-rsa key, so a card gpg --card-status finds now counts whatever gpg.format is. Check 7a was inconclusive on every correctly secured host, because with denyRead covering ~/ every path under it looks missing. It now proves the denial with a sentinel: a file known to exist on the host, such as the shell rc, that the sandbox cannot see. Inconclusive is left for the case with no sentinel. The step-1 output spec gains the inconclusive and unchecked verdicts the skill now emits, with cases for both and a step-2 case for the unchecked routing. The rest is review follow-up: managed settings in check 1's merge, the opt-in question for flagged variable names, the running claude-code version beside an unchecked check 5, the credential-shaped wording of the no-print rule, the update prompt's denial probes, and probe output attributed to stat in the fixtures. Generated-by: Claude Code (Claude Opus 5.5)
With no framework checkout, the claude-code min_version floor could not be compared and was reported unchecked, so a marketplace-only install below the minimum passed. Report that floor as warn instead, and route the re-run accordingly. Under zsh on macOS, test -e on a denied sentinel still returns 0, so the 7a sentinel uses test -r with the /dev/null placeholder exception. A sentinel that stays readable and is not a placeholder now means denyRead is not in effect (fail). A one-call test -r ~/.ssh/id_* misreads as "not readable" with two or more matches (a key plus its .pub is enough), and zsh errors out on no match, so keys are listed with find -H (follows a symlinked ~/.ssh), which behaves the same in bash and zsh. A plugged-in smart card that does not hold the signing key made the touch-overlay checks mandatory for software-key users. A card now counts only when it holds the ssh-format signing key, an OpenPGP signing-capable key (looked up by user.signingkey, else the committer email), or the key a gpg-agent ssh remote authenticates with. A new eval case covers a software signing key with an unrelated card. 7b gains more credential-name patterns, and the docs prompt matches the skill. Generated-by: Claude Code (Opus 5.5, Sonnet 5.5)
shahar1
force-pushed
the
fix/verify-skill-accuracy
branch
from
October 26, 2026 05:47
457e09f to
f065e53
Compare
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
A
setup-isolated-setup-verifyrun on a Linux host (Claude Code started from the VS Code extension, adopter settings only in.claude/settings.local.json) reported several checks as passing that proved nothing. This PR closes those false passes:sandbox.filesystem.denyReadto cover~/. Without that entry, bubblewrap reads are deny-only and credential files stay readable from the sandbox.test -r/stat(nevercat). WhendenyReadcovers~/, a sentinel file known to exist on the host proves the denial. It reports inconclusive only when no sentinel is available. Before, a missing~/.aws/credentialsproduced the same output as a working denial.CLAUDE_CODE_ENTRYPOINTand gives ⚠ for IDE-launched sessions, which never pass throughclaude-iso. The old probe (echo $AWS_ACCESS_KEY_ID) passed regardless, becausesandbox.credentialsalready unsets that variable. The clean-env wrapper doc gains a paragraph on IDE launches..apache-magpie/snapshot, or the directory the shell rc sourcesagent-iso.shfrom), and report unchecked rather than ✗ or ⚠ when there is none. A marketplace-only install has notools/directory, and the running claude-code version is still reported.sk-public key, or a card thatgpg --card-statusfinds). 10c still applies to every ssh-format key.1,3, sogit statuslists them as untracked.docs/setup/secure-agent-setup.md(including "Keeping the setup updated") are kept in sync, and never print a credential.Type of change
.claude/skills/<name>/) — eval fixtures updated belowdocs/,README.md,CONTRIBUTING.md)Test plan
prek run --all-files --skip workspace-pytestpassesprek run workspace-pytest --from-ref upstream/main --to-ref HEADpassesskill-eval --cli "claude -p" tools/skill-evals/evals/setup-isolated-setup-verify/: 29/34 pass. All 7 new cases pass. Of the 5 failures, 4 also fail on unmodifiedupstream/main(step-1 case-7; step-2 case-3, case-5, case-6; the baseline run was 20/27). The fifth, step-1 case-14, passed on two re-runs and is not touched by this PR.case-17-deny-read-missing,case-18-local-settings-only,case-19-ide-entrypoint-env,case-20-plain-ssh-signing-key,case-21-7a-inconclusive,case-22-no-framework-checkout; step-2case-7-unchecked-no-checkout. The step-1 status enum gainsinconclusiveandunchecked.RFC-AI-0004 compliance
denyReadand stop printing credential contentscheck-placeholderspasses)Notes for reviewers (optional)
allowAllUnixSocketsexposure (verify check 12) and the sandbox-lint rules. Both PRs add step-1 eval cases and touch the same README case counts, so whichever merges second needs a trivial rebase.claudeCode.claudeProcessWrapper.agent-iso.sh'senv -iallowlist would drop theCLAUDE_CODE_*variables the extension needs, so that needs its own design and will be raised as a separate issue.Generative AI: drafted with Claude Code (Claude Opus 5.5) and checked by an independent Claude Opus review agent; opened as a draft for the author's line-by-line review before it is marked ready.
🤖 Generated with Claude Code