User Story
As a sandbox developer using automatic policy proposals, I want safe proposals to either merge automatically or explain why they could not, so that I can iterate on a workload without repeatedly diagnosing opaque 403 failures.
Problem Statement
When a host and port already exist as an inspected endpoint for one binary, a denial from another binary can produce a mechanistic proposal for a separate generic L4 endpoint. The proposed endpoint conflicts with the existing endpoint metadata for the same host and port.
The prover can report no new findings while auto-approval subsequently fails during merge or policy validation. The proposal remains pending, but openshell rule get only shows the successful prover result. It does not expose the auto-approval failure. Repeated attempts continue failing and incrementing the proposal hit count.
Impact / Why This Matters
Auto mode appears enabled and the proposal appears safe, but the workload does not progress. Users must inspect gateway logs, infer an endpoint-ambiguity conflict, and manually author a compatible rule. This defeats the quicker deny-propose-approve-retry workflow and is especially costly for dependency resolvers that repeatedly retry the same request.
The current presentation is also misleading: prover: no new findings is shown beside a pending proposal without the separate merge-validation failure that explains why it was not approved.
Acceptance Criteria
Reproduction Steps
-
Create repro-policy.yaml with a REST endpoint for one binary:
version: 1
network_policies:
cargo_registry:
name: cargo-registry
endpoints:
- host: index.crates.io
port: 443
protocol: rest
enforcement: enforce
access: read-only
binaries:
- path: /usr/bin/cargo
-
Create a sandbox with the policy and auto approval:
openshell sandbox create \
--policy repro-policy.yaml \
--approval-mode auto \
auto-approval-repro \
-- sleep infinity
openshell settings set auto-approval-repro \
--key agent_policy_proposals_enabled \
--value true
-
From a different binary, request the same host and port:
openshell sandbox exec auto-approval-repro -- \
/usr/bin/curl https://index.crates.io/config.json
-
Wait for policy analysis to flush, then inspect pending rules:
sleep 15
openshell rule get auto-approval-repro --status pending
-
Observe a pending L4 proposal for /usr/bin/curl on index.crates.io:443 with prover: no new findings. The request remains denied. Gateway logs contain an auto-approval failure, but the chunk output does not contain its reason.
Environment
- OpenShell CLI: 0.0.83
- Host OS: macOS Darwin 25.5.0, ARM64
- Compute runtime: Podman
- Policy advisor: enabled at sandbox scope
- Proposal approval mode: auto at sandbox scope
- Providers v2: enabled globally
Logs
Status: pending
Rule: allow_index_crates_io_443
Binary: /usr/bin/curl
Validation: prover: no new findings
Endpoints: index.crates.io:443 [L4]
[gateway] WARN auto-approval failed; chunk remains pending for human review
User Story
As a sandbox developer using automatic policy proposals, I want safe proposals to either merge automatically or explain why they could not, so that I can iterate on a workload without repeatedly diagnosing opaque 403 failures.
Problem Statement
When a host and port already exist as an inspected endpoint for one binary, a denial from another binary can produce a mechanistic proposal for a separate generic L4 endpoint. The proposed endpoint conflicts with the existing endpoint metadata for the same host and port.
The prover can report no new findings while auto-approval subsequently fails during merge or policy validation. The proposal remains pending, but
openshell rule getonly shows the successful prover result. It does not expose the auto-approval failure. Repeated attempts continue failing and incrementing the proposal hit count.Impact / Why This Matters
Auto mode appears enabled and the proposal appears safe, but the workload does not progress. Users must inspect gateway logs, infer an endpoint-ambiguity conflict, and manually author a compatible rule. This defeats the quicker deny-propose-approve-retry workflow and is especially costly for dependency resolvers that repeatedly retry the same request.
The current presentation is also misleading:
prover: no new findingsis shown beside a pending proposal without the separate merge-validation failure that explains why it was not approved.Acceptance Criteria
proposal_approval_mode=auto, a mergeable proposal with an empty prover delta and no security notes is approved, persisted as a new base-policy revision, and hot-reloaded.openshell rule get.Reproduction Steps
Create
repro-policy.yamlwith a REST endpoint for one binary:Create a sandbox with the policy and auto approval:
From a different binary, request the same host and port:
openshell sandbox exec auto-approval-repro -- \ /usr/bin/curl https://index.crates.io/config.jsonWait for policy analysis to flush, then inspect pending rules:
Observe a pending L4 proposal for
/usr/bin/curlonindex.crates.io:443withprover: no new findings. The request remains denied. Gateway logs contain an auto-approval failure, but the chunk output does not contain its reason.Environment
Logs