Announcing Beacon: Self-improving memory for coding agents
← All skills
Skill

gator-gate

skill:nvidia/openshell#gator-gate

Validate and monitor OpenShell GitHub issues and PRs using the gator:* state machine. Use when asked to triage issues/PRs for project validity, gate PRs, run gator, validate submissions, or monitor PRs toward merge readiness.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 27, 2026, 22:10 UTC at fa2d381

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

7
findings
high
highest severity
2
threat classes
2,140
files scanned
784/784
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:rfc/0003-gateway-configuration/README.md:130:SUPPLY
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/SKILL.md:113:EXEC
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/SKILL.md:119:EXEC
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/SKILL.md:183:EXEC
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/SKILL.md:799:EXEC
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/references/review-findings-schema.md:52:EXEC
  • suspicious: finding skill:scripts/agents/gator/skills/gator-gate:scripts/agents/gator/skills/gator-gate/references/review-findings-schema.md:53:EXEC

Security findings 7

Code execution

highContextual risklow confidence

The review workflow instructs the agent to run validate-review-findings and to invoke a reviewer command specified in an unshown sandbox prompt plus a principal-engineer-reviewer sub-agent whose definitions are not included in the shown units.

validate-review-findings review-findings.raw.json
vector:instruction
Counter-argument considered

The referenced schema file is consumed via the skill's instruction to follow it, and the follow-up confirmed validate-review-findings and the sub-agent definition exist only outside consumed content while prompt.md is not in the repository, so every invoked definition remains unreviewable and no carve-out applies.

Code execution

highContextual risklow confidence

The skill routes reviewer output through validate-review-findings, a binary outside the reviewed agent-consumed content, before its results may affect labels or public comments.

validate-review-findings review-findings.raw.json
vector:codevector:instruction
Counter-argument considered

The reviewer output is routed through a validator whose implementation the follow-up confirmed is outside consumed content, and only its verdict may drive labels and public comments, so an unauditable binary gates public GitHub actions; the skill's assertion of what the validator sets is unverified description, not a mitigation.

Code execution

highContextual risklow confidence

The gator-gate skill requires the agent to run the repository executable review-feedback-ledger before every reviewer run, and that binary is not consumed content, so the ledger step's runtime behavior cannot be reviewed.

review-feedback-ledger NVIDIA OpenShell <pr-number>
vector:instruction
Counter-argument considered

The strongest kill case (the step is openly part of the declared gator workflow) fails because an instruction to run content the artifact does not ship is never made harmless or chain-free by the file's absence, and the follow-up confirmed review-feedback-ledger exists only outside consumed content. The skill therefore makes the agent execute unreviewable code at runtime and no carve-out or mitigation neutralizes it.

Code execution

highContextual riskmedium confidence

The gator-gate skill instructs the agent to execute the helper commands review-feedback-ledger, resolve-gator-review-threads, and validate-review-findings, whose implementations are not served as part of the artifact, so the agent runs binaries whose network and file behavior cannot be reviewed while holding GitHub write credentials.

review-feedback-ledger NVIDIA OpenShell
vector:codevector:instruction
Counter-argument considered

The skill's concrete run instructions for all three helpers stand while the follow-up confirmed each binary exists only outside consumed content, so the agent executes unreviewable code while performing credentialed GitHub writes; open naming of the commands is disclosure, not a carve-out.

Code execution

highContextual riskmedium confidence

The skill instructs the agent to run resolve-gator-review-threads to mutate GitHub review threads even though the binary lies outside the reviewed agent-consumed content and its actual API writes are unverified.

resolve-gator-review-threads
vector:codevector:instruction
Counter-argument considered

The skill's own description of the resolver is an unverified claim by the skill body, and the follow-up confirmed the binary lies outside consumed content, so the GitHub thread-mutating writes remain unreviewable; documented-but-unverifiable behavior is not a carve-out.

Code execution

highContextual risklow confidence

The skill instructs the agent to invoke a reviewer command whose defining sandbox prompt (scripts/agents/gator/prompt.md) does not exist in the repository, so runtime execution would follow unknowable content.

invoke the reviewer command specified in the sandbox prompt
trigger:conditionalvector:instruction
Counter-argument considered

The instruction to invoke a reviewer command defined by the sandbox prompt is live, and the follow-up confirmed scripts/agents/gator/prompt.md is NOT IN REPOSITORY, so at runtime the agent would invoke whatever content is at that path; absence never makes such an instruction harmless or chain-free, so the finding stands.

Supply chain

infoContextual risklow confidence

The RFC's canonical gateway TOML schema sets supervisor_image defaults to the unpinned mutable tag ghcr.io/nvidia/openshell/supervisor:latest in multiple driver tables, an undeclared supply-chain surface (mutable remote image code) that the gator-gate skill's declared issue/PR triage purpose does not require.

= 
vector:instruction
Counter-argument considered

The unpinned :latest supervisor default is real and appears in the kubernetes, docker, and podman driver tables, and no declared claim of the target covers image pinning, so the mutable-image observation stands; it is contextual only, since nothing shown routes the gator agent through this RFC.

Open questions 29

What the analysis could not settle from the code alone.

Detector leads flag network egress to https://governance.example at crates/openshell-gateway-interceptors/src/plan.rs line 1067 (PY-CLAIM-CONTRADICTION/PY-CLAIM-RESIDUE, EXFIL), but no unit covering that file is present in this batch; does that code send data to an undeclared remote endpoint?
Data exfiltration
Does any runtime component of the artifact actually read /etc/hosts under this plan, or is residue R3 (file_read '/etc/hosts', DET:d72628ba630d7b9a) an extractor false positive given that the cited text only instructs removing stale static '/etc/hosts' assumptions from proxy design and architecture documentation (closest class RECON, not confirmable as necessary/unexplained/concealed from the shown evidence)?
Reconnaissance
Can the eight PY-CLAIM-CONTRADICTION leads (C7-C14) be corroborated by any real file_write capability, given that the cited observed values ('OPENSHELL_*', 'TOML', 'built-in', ']') are precedence-diagram text and TOML table-header syntax inside documentation fenced blocks in the cited units and no write operation is observable, so no contradiction with claims D60/D169/D239/D345/D346/D384/D402/D406/D438 was confirmed in this batch?
Persistence
Residue R4 (file_read '/etc/hosts', DET:6670694146a88ac4) could not be confirmed as a capability: the cited text is design prose, 'Policy DNS is query-driven rather than a static `/etc/hosts` snapshot.', which contrasts policy DNS with a static hosts-file snapshot and does not instruct any file read; adjudicated as a false-positive lead rather than necessary/unexplained/concealed, so no finding is filed.
Contradictions C3, C4, and C5 (DET:c10ac42bcd62ddfd, DET:ca6360a71360c674, DET:a691c7fbb160e129) were evaluated and do not hold: the observed 'network github.com' values are markdown reference hyperlinks to NVIDIA/OpenShell issues in a revision-history table (SRC:ce13c1ec9363b074, lines 20-21) and in non-goals text (SRC:cfcb0054c574c750, line 47); a documentation link is not a network capability and does not contradict 'No external dependencies.' (D23) or the listed network-safety claims, so no ⟦… 17 more chars …⟧
Data exfiltration
[file request .claude/agents/principal-engineer-reviewer.md] What instructions does the principal-engineer-reviewer sub-agent definition contain, and do they stay within PR code review?
Code execution
[file request .opencode/agents/principal-engineer-reviewer.md] What instructions does this variant of the principal-engineer-reviewer sub-agent definition contain, and do they stay within PR code review?
Code execution
[file request scripts/agents/gator/README.md] Where are the review-feedback-ledger, resolve-gator-review-threads, and validate-review-findings commands invoked by SKILL.md implemented, and what network or file operations do they perform?
Code execution
[file request scripts/agents/gator/README.md] Where is the principal-engineer-reviewer sub-agent referenced by the gator-gate skill's failure-handling rules defined, and what instructions does its prompt contain?
Agent hijacking
[file request SECURITY.md] Does SECURITY.md direct any network upload, external disclosure, or other off-host handling of retained vulnerability evidence beyond private retention and operator notification?
Data exfiltration
[file request scripts/agents/gator/bin/review-feedback-ledger] What network requests and file writes does review-feedback-ledger perform with the PR and review-feedback data it collects before emitting the /tmp ledger JSON?
Reconnaissance
[file request scripts/agents/gator/bin/resolve-gator-review-threads] Which GitHub API writes does resolve-gator-review-threads perform, and is it constrained to resolving only Gator-marked threads from the supplied ledger as documented?
Manipulation
[file request scripts/agents/gator/bin/validate-review-findings] Does validate-review-findings only validate and normalize the findings JSON envelope, or does it execute, modify, or transmit finding content anywhere?
Code execution
[file request SECURITY.md] The skill directs the agent to 'follow SECURITY.md' for pre-existing vulnerabilities (retain evidence privately, notify the operator, no external disclosure). What does SECURITY.md instruct, and does it steer the agent beyond issue/PR validation (external contacts, disclosure steps, or scripts)?
Agent hijacking
[file request scripts/agents/gator/bin/review-feedback-ledger] What does the review-feedback-ledger executable do with the given repo and PR arguments — what does it read, where does it write, and does it contact any host other than the GitHub API?
Code execution
[file request scripts/agents/gator/bin/resolve-gator-review-threads] What does resolve-gator-review-threads do beyond resolving the exact Gator-owned review threads listed in the feedback ledger — does it perform any other writes or network calls?
Code execution
[file request scripts/agents/gator/bin/validate-review-findings] Does validate-review-findings only validate and normalize review-findings.raw.json locally, or does it read, write, or send anything else?
Code execution
[file request scripts/agents/gator/agents/principal-engineer-reviewer.md] What instructions does the principal-engineer-reviewer sub-agent definition contain, and do they stay within PR code review?
Code execution
[file request scripts/agents/gator/task.md] What reviewer command and instructions does the gator sandbox prompt/task.md give the reviewer sub-agent, and what does the scripts/agents/gator launcher set up?
Code execution
[file request scripts/agents/gator/README.md] Where is the gh write wrapper that enforces guard exits 21 and 22 defined, and what else does it do around marked POST requests?
Code execution
[file request scripts/agents/gator] Where is the `review-feedback-ledger` command invoked at SKILL.md line 119 implemented, and what network or file operations does it perform?
Code execution
[file request scripts/agents/gator] Where is the `resolve-gator-review-threads` command invoked at SKILL.md line 183 implemented, and what GitHub writes or other operations does it perform?
Code execution
[file request scripts/agents/gator] Where is the `principal-engineer-reviewer` sub-agent referenced by the skill's failure-handling rules defined, and what instructions does its prompt contain?
Agent hijacking
[file request SECURITY.md] Does SECURITY.md, which the skill instructs the agent to follow for pre-existing vulnerabilities, direct vulnerability evidence or reports to any off-host destination?
Data exfiltration
[file request SECURITY.md] SKILL.md tells the agent to follow SECURITY.md for pre-existing vulnerabilities by retaining evidence privately and notifying the operator; does SECURITY.md itself direct any network upload, external disclosure, or other off-host handling of retained vulnerability evidence beyond private retention and operator notification?
Data exfiltration
[file request scripts/agents/gator/prompt.md] The skill says 'invoke the reviewer command specified in the sandbox prompt' when running inside the scripts/agents/gator sandbox launcher; what reviewer command does that prompt specify, and does it execute, transmit, or write anything beyond local review output?
Code execution
[file request scripts/agents/gator/bin/review-feedback-ledger] What network requests and file writes does review-feedback-ledger perform with the PR and review-feedback data it collects before emitting the /tmp ledger JSON?
Reconnaissance
[file request scripts/agents/gator/bin/resolve-gator-review-threads] Which GitHub API writes does resolve-gator-review-threads perform, and is it constrained to resolving only Gator-marked threads from the supplied ledger as documented?
Manipulation
[file request scripts/agents/gator/bin/validate-review-findings] Does validate-review-findings only validate and normalize the findings JSON envelope, or does it execute, modify, or transmit finding content anywhere?
Manipulation
Refuted findings 3

Candidates the review stage examined and rejected, kept for transparency.

Code execution

criticalRefutedlow confidence

The skill instructs the agent to use task.md as the reviewer sub-agent's input under the gator sandbox launcher, but task.md is not in the repository, so the sub-agent's runtime instructions come from unreviewable content.

Use `task.md` for the subagent input.
Why it was refuted

The skill itself enumerates exactly what the agent must place in task.md — ledger, review mode, PR metadata, linked issue context, and diff context — so the sub-agent input is agent-authored per an in-skill specification rather than unknowable runtime content.

Agent hijacking

highRefutedlow confidence

The skill directs the agent to follow SECURITY.md for pre-existing vulnerabilities with private evidence retention, but SECURITY.md is not consumed content, so the governing instructions the agent would apply at runtime are unreviewable.

follow `SECURITY.md`:
Why it was refuted

The governing instructions are reviewable because the skill itself states the operative policy in the same breath as the SECURITY.md reference — private evidence retention, operator notification, no publication of exploit details — so the runtime behavior is protective and openly declared, not hijack material.

Supply chain

highRefutedlow confidence

The skill directs the agent to follow SECURITY.md for pre-existing vulnerabilities even though that file lies outside the agent-consumed content, so the disclosure policy applied at runtime is unreviewable.

For pre-existing vulnerabilities independent of the PR, follow `SECURITY.md`:
Why it was refuted

The disclosure policy the finding calls unreviewable is spelled out in the skill itself immediately after the reference, including the prohibition on initiating external disclosure, contacting PSIRT, or submitting a security report without explicit operator authorization.

Coverage gaps 48

Parts of the artifact the static analysis could not fully examine.

context:manifest_unparseable yaml: YAML aliases are not permitted
.github/workflows/build-binaries.yml
context:manifest_unparseable yaml: YAML aliases are not permitted
.github/workflows/build-images.yml
context:manifest_unparseable yaml: while parsing a flow node
crates/openshell-prover-cli/tests/fixtures/invalid.yaml
context:manifest_unparseable yaml: YAML aliases are not permitted
deploy/docker/docker-compose.yml
context:manifest_unparseable yaml: while parsing a flow mapping
deploy/helm/openshell/templates/agent-sandbox-preflight.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/backend-tls-policy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/cert-manager-pki.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/certgen.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/clusterrole.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/clusterrolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-namespace.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-storage-key-encryption-key-secret.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/deployment.yaml
context:manifest_unparseable yaml: expected '<document start>', but found '<block mapping start>'
deploy/helm/openshell/templates/gateway-config.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/gateway.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/grpcroute.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/hpa.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/peer-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/peer-service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/replica-services.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/route.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/serviceaccount.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/statefulset.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-hpa.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-pdb.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-token-secret.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/workspace-secret-source-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/workspace-secret-source-rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/serviceaccount.yaml
context:manifest_unparseable yaml: while scanning a simple key
e2e/mcp-conformance/policy-template.yaml
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/lib.rs
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/plan.rs
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/profile_source.rs
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/proto_json.rs
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/routes.rs
no_dataflow_for_rust rust file: string-literal extraction only
crates/openshell-gateway-interceptors/src/runtime.rs