You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
when *both* (a) the prover delta is empty (`prover: no new findings`) AND
106
+
(b) the `proposal_approval_mode` setting resolves to `"auto"` — gateway
107
+
scope wins, sandbox scope is the per-sandbox override, default is
108
+
`"manual"`. When both hold, the gateway internally invokes the approve
109
+
path with actor identity `system:auto`. The audit event uses
110
+
`CONFIG:APPROVED` and carries `auto=true`, `source=<mode>`,
111
+
`prover_delta=empty`, and `resolved_from=<gateway|sandbox>` as unmapped
112
+
fields, with message text `"auto-approved: no new prover findings"` —
113
+
never `safe`. The opt-in gate preserves OpenShell's default-deny
114
+
posture: with no setting at either scope, every proposal lands in
115
+
`pending` for human review, even when the prover sees no findings.
116
+
4.**Implicit supersede.** On any successful submission, the gateway scans
117
+
the sandbox's pending chunks for matches on `(host, port, binary)` and
118
+
auto-rejects the older ones with reason `"superseded by chunk X"`. This
119
+
gives the agent a refinement path (broad mechanistic L4 → narrow agent
120
+
L7) without an explicit `supersedes_chunk_id` field.
121
+
5.**Escalation.** Anything else lands in `pending` for human review.
122
+
123
+
## What the prover decides
124
+
125
+
The prover answers four formal questions about each proposed policy
126
+
change. Each "yes" answer becomes its own categorical finding — there is
127
+
no severity grade. Any finding (of any category) blocks auto-approval.
128
+
The categories are intended to be (mostly) mutually exclusive per
129
+
underlying change: the gateway suppresses `capability_expansion` paths
130
+
whose `(binary, host, port)` is also in the `credential_reach_expansion`
131
+
delta, so a brand-new credentialed reach surfaces as one finding rather
132
+
than one reach + N method findings.
133
+
134
+
| Category | The prover detects… |
135
+
|---|---|
136
+
|`link_local_reach`| The proposal grants reach to a host in `169.254.0.0/16`, `fe80::/10`, or a known metadata hostname such as `metadata.google.internal`. Unconditional — cloud-metadata endpoints serve credentials regardless of sandbox state. |
137
+
|`l7_bypass_credentialed`| The proposal lets a binary using a non-HTTP wire protocol (`git-remote-https`, `ssh`, `nc`) reach a host where a sandbox credential is in scope. The L7 proxy cannot inspect the wire protocol; the reviewer decides whether to trust the binary with the credential. |
138
+
|`credential_reach_expansion`| A binary gained credentialed reach to a (host, port) it could not reach before. New authenticated reach is a stated intent change; the reviewer confirms the binary should authenticate to the host at all. |
139
+
|`capability_expansion`| On a (binary, host, port) that already had credentialed reach, the policy adds a new HTTP method. The reviewer sees exactly which method was added (e.g., PUT) and decides if it's part of the agent's task. |
140
+
141
+
"Credential in scope" is sandbox-coarse, not binary-fine: a credential is
142
+
considered in scope if the sandbox has a provider attached whose
143
+
`target_hosts` include the proposed endpoint's host, including runtime-like
144
+
first-label wildcard coverage such as `*.github.com` covering
145
+
`api.github.com`. v1 does not model credential scopes (read-only vs write);
146
+
presence is enough.
99
147
100
148
Proposals intentionally omit `allowed_ips`. If a proposed rule targets a host
101
149
that resolves to a private IP, the proxy's runtime SSRF classification blocks
102
150
the connection. The operator must then add an explicit `allowed_ips` entry to
103
151
permit it — a two-step flow that keeps SSRF protection on by default.
104
152
105
-
The advisor should propose narrow additions and preserve explicit-deny behavior.
106
-
It is a workflow aid, not an automatic permission grant.
153
+
The advisor proposes narrow additions and preserves explicit-deny behavior.
154
+
Auto-approval is gated on prover determinism, not human judgment; an LLM-based
155
+
contextual reviewer is a deliberate future addition layered on top of the
"{} failed to set approval mode '{approval_mode}' on sandbox '{sandbox_name}': {}\n retry with: openshell settings set {sandbox_name} proposal_approval_mode {approval_mode}",
1835
+
"warning:".yellow().bold(),
1836
+
status.message(),
1837
+
);
1838
+
}
1839
+
}
1840
+
}
1841
+
1809
1842
// Set up display — interactive terminals get a step-based checklist with
1810
1843
// spinners; non-interactive (pipes / CI) get timestamped lines.
0 commit comments