@f4bioo/berry-shield 2026.3.3-2 → 2026.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -29
- package/dist/index.js +4908 -1429
- package/docs/wiki/deploy/installation.md +11 -1
- package/docs/wiki/layers/root.md +2 -0
- package/docs/wiki/layers/stem.md +5 -3
- package/docs/wiki/layers/vine.md +40 -0
- package/docs/wiki/operation/cli/README.md +18 -2
- package/docs/wiki/operation/cli/add.md +1 -1
- package/docs/wiki/operation/cli/remove.md +24 -2
- package/docs/wiki/operation/cli/rules.md +47 -8
- package/docs/wiki/operation/cli/status.md +12 -0
- package/docs/wiki/operation/cli/test.md +21 -6
- package/docs/wiki/operation/cli/vine.md +37 -0
- package/docs/wiki/tutorials/README.md +1 -0
- package/docs/wiki/tutorials/choose-vine-confirmation.md +94 -0
- package/docs/wiki/tutorials/incident-triage-report.md +1 -1
- package/openclaw.plugin.json +42 -2
- package/package.json +13 -8
|
@@ -14,7 +14,7 @@ This guide defines two installation tracks and when each one should be used.
|
|
|
14
14
|
|
|
15
15
|
## Prerequisites
|
|
16
16
|
|
|
17
|
-
- Node.js
|
|
17
|
+
- Node.js 22.16.0 or newer.
|
|
18
18
|
- OpenClaw runtime available in environment.
|
|
19
19
|
- Git available in environment.
|
|
20
20
|
|
|
@@ -34,6 +34,16 @@ Practical rule:
|
|
|
34
34
|
For official OpenClaw plugin installation behavior, see:
|
|
35
35
|
- https://docs.openclaw.ai/tools/plugin
|
|
36
36
|
|
|
37
|
+
## Host hook note
|
|
38
|
+
|
|
39
|
+
OpenClaw host behavior can influence prompt-level guidance hooks used by Berry Shield.
|
|
40
|
+
|
|
41
|
+
Operational note:
|
|
42
|
+
- if the host explicitly disables plugin prompt-injection style prepend behavior for hooks, `Berry.Root` and Vine reminder guidance from `before_agent_start` can be partially degraded.
|
|
43
|
+
|
|
44
|
+
See more:
|
|
45
|
+
- [Technical limitations and host behavior](../../../README.md#-technical-limitations--sdk-diary)
|
|
46
|
+
|
|
37
47
|
|
|
38
48
|
### Quick navigation
|
|
39
49
|
|
package/docs/wiki/layers/root.md
CHANGED
|
@@ -98,6 +98,8 @@ Root is useful for:
|
|
|
98
98
|
## Limits and caveats
|
|
99
99
|
|
|
100
100
|
- Root is instruction-level control, not hard execution enforcement.
|
|
101
|
+
- If the host disables prompt-injection style prepend behavior for plugin hooks, Root guidance can be partially degraded because `before_agent_start` context may no longer be injected.
|
|
102
|
+
- This is a host/runtime constraint, not a full Berry Shield plugin failure.
|
|
101
103
|
- If runtime context identity is missing, global safety fallback can increase policy verbosity.
|
|
102
104
|
- Excessive full injections increase token cost.
|
|
103
105
|
- Too little reinjection can reduce model adherence in long sessions.
|
package/docs/wiki/layers/stem.md
CHANGED
|
@@ -24,6 +24,7 @@ The tool evaluates operation intent (exec, read, write) against destructive-comm
|
|
|
24
24
|
- sensitive file access in read/write requests
|
|
25
25
|
- Emits structured audit events in both audit and enforce paths.
|
|
26
26
|
- Returns allow/deny response payloads to the agent.
|
|
27
|
+
- Returns the standard `CONFIRM_REQUIRED` challenge when Vine risk is active, even if host/runtime identity is degraded.
|
|
27
28
|
- Triggers adaptive escalation signaling on enforce denies.
|
|
28
29
|
|
|
29
30
|
## What Stem does not do
|
|
@@ -40,10 +41,11 @@ flowchart TD
|
|
|
40
41
|
A[Agent requests gate check] --> B[Berry.Stem]
|
|
41
42
|
B --> C{Input valid?}
|
|
42
43
|
C -->|No| E[Reject request]
|
|
43
|
-
C -->|Yes| D{
|
|
44
|
+
C -->|Yes| D{Policy or Vine risk?}
|
|
44
45
|
D -->|No| ALLOW[Return ALLOWED]
|
|
45
|
-
D -->|Yes + audit| WB[Emit would_block
|
|
46
|
-
D -->|Yes +
|
|
46
|
+
D -->|Yes + audit| WB[Emit would_block or would_confirm_required]
|
|
47
|
+
D -->|Yes + confirm| CONFIRM[Return CONFIRM_REQUIRED]
|
|
48
|
+
D -->|Yes + deny| DENY[Return DENIED + blocked event]
|
|
47
49
|
WB --> ALLOW
|
|
48
50
|
DENY --> ESC[Adaptive escalation signal]
|
|
49
51
|
```
|
package/docs/wiki/layers/vine.md
CHANGED
|
@@ -13,6 +13,18 @@ Berry.Vine is the **external-content trust guard layer**.
|
|
|
13
13
|
|
|
14
14
|
It reduces prompt-injection risk by treating external content as untrusted by default and enforcing trust-aware checks before sensitive operations.
|
|
15
15
|
|
|
16
|
+
## Philosophy
|
|
17
|
+
|
|
18
|
+
Vine is designed to act as a **pause layer**, not as a hard isolation barrier.
|
|
19
|
+
|
|
20
|
+
Its job is to slow down risky external-content-driven flows long enough to require visible human intent before the agent continues with a sensitive action.
|
|
21
|
+
|
|
22
|
+
Operationally, this means:
|
|
23
|
+
- prefer an explicit confirmation pause over a silent allow when external risk is active;
|
|
24
|
+
- avoid turning degraded binding or imperfect session identity into a hard product lockout by default;
|
|
25
|
+
- use confirmation as the pragmatic fallback when the host/runtime context is incomplete but the channel can still support a human pause;
|
|
26
|
+
- keep the focus on interrupting unsafe momentum, not on pretending Vine is a complete antivirus-style boundary.
|
|
27
|
+
|
|
16
28
|
## What Vine does
|
|
17
29
|
|
|
18
30
|
- Tracks external-risk signals per session.
|
|
@@ -29,6 +41,32 @@ It reduces prompt-injection risk by treating external content as untrusted by de
|
|
|
29
41
|
- It does not rely on semantic AI classification.
|
|
30
42
|
- It does not auto-remediate without explicit operator action.
|
|
31
43
|
|
|
44
|
+
## Confirmation strategies
|
|
45
|
+
|
|
46
|
+
Vine supports two confirmation strategies for sensitive actions under active external risk:
|
|
47
|
+
|
|
48
|
+
- `one_to_one` (`1:1`): one human confirmation code is consumed by one sensitive action.
|
|
49
|
+
- `one_to_many` (`1:N`): one human confirmation code can unlock multiple sensitive actions within a short bounded window.
|
|
50
|
+
|
|
51
|
+
Operational default:
|
|
52
|
+
- `one_to_many` is the default strategy.
|
|
53
|
+
|
|
54
|
+
Important fields:
|
|
55
|
+
- code TTL: how long a challenge code remains valid.
|
|
56
|
+
- confirmation window: how long the `1:N` execution window stays open after approval.
|
|
57
|
+
- max actions per window: how many sensitive actions the `1:N` approval can unlock inside that window.
|
|
58
|
+
- max attempts: how many invalid confirmation attempts are tolerated before the challenge is exhausted.
|
|
59
|
+
|
|
60
|
+
High-level confirmation flow:
|
|
61
|
+
- Berry detects active external-risk state.
|
|
62
|
+
- A sensitive action is evaluated through `berry_check` or `before_tool_call`.
|
|
63
|
+
- Vine emits a confirmation challenge when human intent must be made explicit.
|
|
64
|
+
- Human approval unlocks the real action according to the configured strategy.
|
|
65
|
+
|
|
66
|
+
Degraded path:
|
|
67
|
+
- if native binding or session identity is degraded, Berry still uses the normal `CONFIRM_REQUIRED` code-based challenge instead of silently allowing the action;
|
|
68
|
+
- degraded identity may reduce correlation precision, but it does not change the public confirmation protocol.
|
|
69
|
+
|
|
32
70
|
## Runtime flow
|
|
33
71
|
|
|
34
72
|
```mermaid
|
|
@@ -61,6 +99,7 @@ Key operational rule:
|
|
|
61
99
|
### Enforce
|
|
62
100
|
- Sensitive actions under active external risk can be blocked.
|
|
63
101
|
- In strict profile, unknown-origin sensitive attempts can also block.
|
|
102
|
+
- When native confirmation binding is degraded, Berry still uses the same explicit code-based confirmation flow instead of silently allowing the action.
|
|
64
103
|
|
|
65
104
|
### Audit
|
|
66
105
|
- No hard block.
|
|
@@ -129,6 +168,7 @@ Important scope:
|
|
|
129
168
|
## Limits and caveats
|
|
130
169
|
|
|
131
170
|
- Hook timing and availability still depend on host runtime behavior.
|
|
171
|
+
- If the host disables prompt-injection style context prepend for plugin hooks, Vine reminder text from `before_agent_start` can be neutralized even though risk tracking and action guarding still exist.
|
|
132
172
|
- Unknown-origin classification can create false positives if over-tuned.
|
|
133
173
|
- Risk decay should not depend only on elapsed time.
|
|
134
174
|
|
|
@@ -76,14 +76,23 @@ openclaw bshield rules list
|
|
|
76
76
|
Expected: CLI shows baseline and custom IDs, including `[ENABLED]` and `[DISABLED]` status.
|
|
77
77
|
|
|
78
78
|
### 6) Disable one baseline rule
|
|
79
|
-
Use this to disable
|
|
79
|
+
Use this to disable baseline rules by stable ID. This applies to both internal `berry:` patterns and `gitleaks:` community rules.
|
|
80
|
+
|
|
81
|
+
Example (Berry Shield):
|
|
82
|
+
```bash
|
|
83
|
+
openclaw bshield rules disable baseline berry:secret:openai-key
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Example (Gitleaks Community):
|
|
80
87
|
```bash
|
|
81
|
-
openclaw bshield rules disable baseline secret:
|
|
88
|
+
openclaw bshield rules disable baseline gitleaks:secret:aws-access-token
|
|
82
89
|
```
|
|
83
90
|
Expected: CLI marks the target baseline rule as disabled.
|
|
84
91
|
|
|
85
92
|
### 7) Disable one custom rule
|
|
86
93
|
Use this to keep a custom rule stored but inactive.
|
|
94
|
+
|
|
95
|
+
Example (User custom):
|
|
87
96
|
```bash
|
|
88
97
|
openclaw bshield rules disable custom secret:my-token-rule
|
|
89
98
|
```
|
|
@@ -96,6 +105,13 @@ openclaw bshield vine set mode strict
|
|
|
96
105
|
```
|
|
97
106
|
Expected: CLI confirms strict Vine mode for external-content guard behavior.
|
|
98
107
|
|
|
108
|
+
### 9) Inspect or change Vine confirmation strategy
|
|
109
|
+
Use this when you need to verify or switch between `1:1` and `1:N` confirmation behavior.
|
|
110
|
+
```bash
|
|
111
|
+
openclaw bshield vine confirmation
|
|
112
|
+
```
|
|
113
|
+
Expected: CLI opens the interactive selector for Vine confirmation strategy.
|
|
114
|
+
|
|
99
115
|
## Documentation structure
|
|
100
116
|
|
|
101
117
|
Each command page follows the same structure:
|
|
@@ -97,7 +97,7 @@ If cancel is selected, the wizard exits without persisting data.
|
|
|
97
97
|
### Step 2: Preset or custom pattern
|
|
98
98
|
After choosing type, the wizard offers:
|
|
99
99
|
- custom pattern
|
|
100
|
-
-
|
|
100
|
+
- baseline presets for the selected type
|
|
101
101
|
- cancel
|
|
102
102
|
|
|
103
103
|
If a preset is selected, name/pattern/placeholder values are prefilled from that preset.
|
|
@@ -40,6 +40,8 @@ Positional arguments:
|
|
|
40
40
|
|
|
41
41
|
### Remove an existing custom rule
|
|
42
42
|
Use this when the exact custom rule id is known.
|
|
43
|
+
|
|
44
|
+
Example (User custom):
|
|
43
45
|
```bash
|
|
44
46
|
openclaw bshield rules remove custom secret:MyToken
|
|
45
47
|
```
|
|
@@ -47,6 +49,8 @@ Result: CLI confirms custom rule removal.
|
|
|
47
49
|
|
|
48
50
|
### Remove a custom file rule
|
|
49
51
|
Use this when a file-pattern custom rule must be removed.
|
|
52
|
+
|
|
53
|
+
Example (User custom):
|
|
50
54
|
```bash
|
|
51
55
|
openclaw bshield rules remove custom file:team-key
|
|
52
56
|
```
|
|
@@ -61,8 +65,15 @@ Result: Removed custom rule no longer appears in custom entries.
|
|
|
61
65
|
|
|
62
66
|
### Disable a baseline rule (separate command)
|
|
63
67
|
Use this when the target is a baseline ID.
|
|
68
|
+
|
|
69
|
+
Example (Berry Shield):
|
|
70
|
+
```bash
|
|
71
|
+
openclaw bshield rules disable baseline berry:secret:openai-key
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Example (Gitleaks Community):
|
|
64
75
|
```bash
|
|
65
|
-
openclaw bshield rules disable baseline secret:
|
|
76
|
+
openclaw bshield rules disable baseline gitleaks:secret:aws-access-token
|
|
66
77
|
```
|
|
67
78
|
Result: Baseline rule is marked disabled in rules inventory.
|
|
68
79
|
|
|
@@ -70,13 +81,24 @@ Result: Baseline rule is marked disabled in rules inventory.
|
|
|
70
81
|
|
|
71
82
|
### Wrong target
|
|
72
83
|
Use this to validate explicit target semantics.
|
|
84
|
+
|
|
85
|
+
Example (Berry Shield):
|
|
73
86
|
```bash
|
|
74
|
-
openclaw bshield rules remove baseline
|
|
87
|
+
# openclaw bshield rules remove baseline <id>
|
|
88
|
+
openclaw bshield rules remove baseline berry:secret:openai-key
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Example (Gitleaks Community):
|
|
92
|
+
```bash
|
|
93
|
+
# openclaw bshield rules remove baseline <id>
|
|
94
|
+
openclaw bshield rules remove baseline gitleaks:secret:aws-access-key
|
|
75
95
|
```
|
|
76
96
|
Expected: CLI returns usage error because remove supports only custom target.
|
|
77
97
|
|
|
78
98
|
### Rule not found
|
|
79
99
|
Use this to verify missing-rule behavior.
|
|
100
|
+
|
|
101
|
+
Example (User custom):
|
|
80
102
|
```bash
|
|
81
103
|
openclaw bshield rules remove custom secret:UnknownRule
|
|
82
104
|
```
|
|
@@ -46,30 +46,54 @@ openclaw bshield rules remove custom <id>
|
|
|
46
46
|
Expected: Removes one custom rule by typed id (`secret:<name> | file:<name> | command:<name>`).
|
|
47
47
|
|
|
48
48
|
### Disable one baseline rule
|
|
49
|
-
Use this to disable
|
|
49
|
+
Use this to disable baseline rules by stable ID. This applies to both internal `berry:` patterns and `gitleaks:` community rules.
|
|
50
|
+
|
|
51
|
+
Example (Berry Shield):
|
|
52
|
+
```bash
|
|
53
|
+
# openclaw bshield rules disable baseline <id>
|
|
54
|
+
openclaw bshield rules disable baseline berry:secret:openai-key
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Example (Gitleaks Community):
|
|
50
58
|
```bash
|
|
51
|
-
openclaw bshield rules disable baseline <id>
|
|
59
|
+
# openclaw bshield rules disable baseline <id>
|
|
60
|
+
openclaw bshield rules disable baseline gitleaks:secret:aws-access-token
|
|
52
61
|
```
|
|
53
62
|
Expected: Marks one baseline rule as disabled.
|
|
54
63
|
|
|
55
64
|
### Disable one custom rule
|
|
56
65
|
Use this to disable one custom rule without deleting it.
|
|
66
|
+
|
|
67
|
+
Example (User custom):
|
|
57
68
|
```bash
|
|
58
|
-
openclaw bshield rules disable custom <id>
|
|
69
|
+
# openclaw bshield rules disable custom <id>
|
|
70
|
+
openclaw bshield rules disable custom secret:my-token-rule
|
|
59
71
|
```
|
|
60
72
|
Expected: Marks one custom rule as disabled and keeps it in inventory.
|
|
61
73
|
|
|
62
74
|
### Enable one baseline rule
|
|
63
|
-
Use this to re-enable
|
|
75
|
+
Use this to re-enable baseline rules by stable ID. This applies to both internal `berry:` patterns and `gitleaks:` community rules.
|
|
76
|
+
|
|
77
|
+
Example (Berry Shield):
|
|
78
|
+
```bash
|
|
79
|
+
# openclaw bshield rules enable baseline <id>
|
|
80
|
+
openclaw bshield rules enable baseline berry:secret:openai-key
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Example (Gitleaks Community):
|
|
64
84
|
```bash
|
|
65
|
-
openclaw bshield rules enable baseline <id>
|
|
85
|
+
# openclaw bshield rules enable baseline <id>
|
|
86
|
+
openclaw bshield rules enable baseline gitleaks:secret:aws-access-token
|
|
66
87
|
```
|
|
67
88
|
Expected: Marks one baseline rule as enabled.
|
|
68
89
|
|
|
69
90
|
### Enable one custom rule
|
|
70
91
|
Use this to re-enable one custom rule by ID.
|
|
92
|
+
|
|
93
|
+
Example (User custom):
|
|
71
94
|
```bash
|
|
72
|
-
openclaw bshield rules enable custom <id>
|
|
95
|
+
# openclaw bshield rules enable custom <id>
|
|
96
|
+
openclaw bshield rules enable custom secret:my-token-rule
|
|
73
97
|
```
|
|
74
98
|
Expected: Marks one custom rule as enabled.
|
|
75
99
|
|
|
@@ -128,21 +152,36 @@ Expected: Applies enable to full rule scope (`baseline + custom`).
|
|
|
128
152
|
|
|
129
153
|
### Wrong target for remove
|
|
130
154
|
Use this check to validate that remove only accepts the custom target.
|
|
155
|
+
|
|
156
|
+
Example (Berry Shield):
|
|
157
|
+
```bash
|
|
158
|
+
# openclaw bshield rules remove baseline <id>
|
|
159
|
+
openclaw bshield rules remove baseline berry:secret:openai-key
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Example (Gitleaks Community):
|
|
131
163
|
```bash
|
|
132
|
-
openclaw bshield rules remove baseline
|
|
164
|
+
# openclaw bshield rules remove baseline <id>
|
|
165
|
+
openclaw bshield rules remove baseline gitleaks:secret:aws-access-token
|
|
133
166
|
```
|
|
134
167
|
Expected: Usage failure (remove supports only custom target).
|
|
135
168
|
|
|
136
169
|
### Unknown baseline ID
|
|
137
170
|
Use this check to validate error handling when an ID does not exist in baseline catalog.
|
|
171
|
+
|
|
172
|
+
Example (Berry Shield):
|
|
138
173
|
```bash
|
|
139
|
-
openclaw bshield rules disable baseline
|
|
174
|
+
# openclaw bshield rules disable baseline <id>
|
|
175
|
+
openclaw bshield rules disable baseline berry:secret:does-not-exist
|
|
140
176
|
```
|
|
141
177
|
Expected: Operation failure (`Unknown baseline rule id`).
|
|
142
178
|
|
|
143
179
|
### Unknown custom ID
|
|
144
180
|
Use this check to validate error handling when a custom rule is not found.
|
|
181
|
+
|
|
182
|
+
Example (User custom):
|
|
145
183
|
```bash
|
|
184
|
+
# openclaw bshield rules disable custom <id>
|
|
146
185
|
openclaw bshield rules disable custom secret:does-not-exist
|
|
147
186
|
```
|
|
148
187
|
Expected: Operation failure (`Unknown custom rule id`).
|
|
@@ -16,6 +16,7 @@ Show the effective Berry Shield runtime state resolved from OpenClaw plugin conf
|
|
|
16
16
|
- Prints current plugin state (`Status`, `Mode`, and rule counters).
|
|
17
17
|
- Prints policy state (`Profile`, adaptive values, and global escalation toggle).
|
|
18
18
|
- Prints Vine state (`Mode`, thresholds, retention, and allowlist size).
|
|
19
|
+
- Prints Vine confirmation state (`Confirmation Strategy`, active strategy marker, TTL, attempts, and window values).
|
|
19
20
|
- Prints each security layer status as `ACTIVE` or `OFF`.
|
|
20
21
|
|
|
21
22
|
## When to use
|
|
@@ -63,6 +64,17 @@ Result expected:
|
|
|
63
64
|
- Thresholds and retention values match expected operational tuning.
|
|
64
65
|
- `Allowlist` shows the number of exempt tools.
|
|
65
66
|
|
|
67
|
+
### Vine Confirmation section
|
|
68
|
+
Command for this check: `openclaw bshield status`.
|
|
69
|
+
Result expected:
|
|
70
|
+
- `Confirmation Strategy` shows the configured runtime contract (`1:1` or `1:N`).
|
|
71
|
+
- `1:1` and `1:N` show which strategy is currently `ACTIVE`.
|
|
72
|
+
- `Code TTL (sec)` shows how long the challenge code remains valid.
|
|
73
|
+
- `Max Attempts` shows how many invalid confirmation tries are tolerated.
|
|
74
|
+
- `Window (sec)` and `Max Actions/Window` matter primarily for `1:N`.
|
|
75
|
+
- `Window (sec)` is the active multi-action approval window after a successful confirmation.
|
|
76
|
+
- `Max Actions/Window` is the maximum number of sensitive actions that one `1:N` approval can unlock inside that window.
|
|
77
|
+
|
|
66
78
|
### Security layers section
|
|
67
79
|
Command for this check: `openclaw bshield status`.
|
|
68
80
|
Result expected:
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
summary: "CLI reference for `openclaw bshield test` (test one input against active match patterns)"
|
|
3
3
|
read_when:
|
|
4
|
-
- You need to verify if a string matches
|
|
4
|
+
- You need to verify if a string matches baseline or custom patterns
|
|
5
5
|
- You are validating custom regex behavior before production use
|
|
6
6
|
title: "test"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# `openclaw bshield test`
|
|
10
10
|
|
|
11
|
-
Test one input string against active
|
|
11
|
+
Test one input string against active baseline and custom match patterns.
|
|
12
12
|
|
|
13
13
|
## What it does
|
|
14
|
-
- Loads
|
|
14
|
+
- Loads baseline secret/PII patterns and custom secret rules.
|
|
15
15
|
- Evaluates the provided input against active patterns.
|
|
16
16
|
- Prints either no-match output or match details with rule source and redaction placeholder.
|
|
17
17
|
|
|
@@ -45,7 +45,7 @@ Expected: CLI reports no matches or prints one or more matching rule entries.
|
|
|
45
45
|
|
|
46
46
|
## Options
|
|
47
47
|
Positional argument:
|
|
48
|
-
- `<input>`: string to test against active
|
|
48
|
+
- `<input>`: string to test against active baseline and custom patterns.
|
|
49
49
|
|
|
50
50
|
## Examples
|
|
51
51
|
|
|
@@ -78,9 +78,24 @@ openclaw bshield test "SMOKE_WEB_CMD"
|
|
|
78
78
|
Expected: `No matches found` because this command does not evaluate custom command/file rules.
|
|
79
79
|
|
|
80
80
|
### Typed ID input is not a payload value
|
|
81
|
-
Use this when input is a rule ID format.
|
|
81
|
+
Use this when input is a rule ID format to confirm it is not used as a test literal.
|
|
82
|
+
|
|
83
|
+
Example (Berry Shield):
|
|
84
|
+
```bash
|
|
85
|
+
# openclaw bshield test "<input>"
|
|
86
|
+
openclaw bshield test "berry:command:smoke-web-cmd"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Example (Gitleaks Community):
|
|
90
|
+
```bash
|
|
91
|
+
# openclaw bshield test "<input>"
|
|
92
|
+
openclaw bshield test "gitleaks:secret:aws-access-token"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Example (User custom):
|
|
82
96
|
```bash
|
|
83
|
-
openclaw bshield test "
|
|
97
|
+
# openclaw bshield test "<input>"
|
|
98
|
+
openclaw bshield test "secret:my-token"
|
|
84
99
|
```
|
|
85
100
|
Expected: no matches and guidance that typed IDs are rule identifiers, not payload values for this command.
|
|
86
101
|
|
|
@@ -16,6 +16,7 @@ Manage Berry.Vine configuration and tool allowlist from CLI.
|
|
|
16
16
|
- Writes deterministic Vine paths (set).
|
|
17
17
|
- Adds one tool to Vine allowlist (allow).
|
|
18
18
|
- Removes one tool from Vine allowlist (deny).
|
|
19
|
+
- Opens the interactive confirmation-strategy selector (confirmation).
|
|
19
20
|
|
|
20
21
|
## When to use
|
|
21
22
|
- Before smoke tests that need strict/balanced Vine behavior.
|
|
@@ -80,6 +81,21 @@ Supported `set` paths:
|
|
|
80
81
|
- `thresholds.forcedGuardTurns` (integer `>= 1`)
|
|
81
82
|
- `retention.maxEntries` (integer `>= 1`)
|
|
82
83
|
- `retention.ttlSeconds` (integer `>= 1`)
|
|
84
|
+
- `confirmation.strategy` (`one_to_one | one_to_many`)
|
|
85
|
+
- `confirmation.codeTtlSeconds` (integer `>= 1`)
|
|
86
|
+
- `confirmation.maxAttempts` (integer `>= 1`)
|
|
87
|
+
- `confirmation.windowSeconds` (integer `>= 1`)
|
|
88
|
+
- `confirmation.maxActionsPerWindow` (integer `>= 1`)
|
|
89
|
+
|
|
90
|
+
Confirmation strategy meanings:
|
|
91
|
+
- `one_to_one` (`1:1`): one code unlocks one sensitive action.
|
|
92
|
+
- `one_to_many` (`1:N`): one code can unlock multiple sensitive actions inside the active confirmation window.
|
|
93
|
+
|
|
94
|
+
Default:
|
|
95
|
+
- `one_to_many` is the default confirmation strategy.
|
|
96
|
+
|
|
97
|
+
Operational note:
|
|
98
|
+
- if host/runtime binding is degraded, Vine still uses the same visible code-based confirmation flow without changing the configured confirmation strategy itself.
|
|
83
99
|
|
|
84
100
|
## Tuning guide
|
|
85
101
|
|
|
@@ -139,6 +155,20 @@ openclaw bshield vine set thresholds.forcedGuardTurns 2
|
|
|
139
155
|
```
|
|
140
156
|
Result: CLI confirms forced guard turns updated.
|
|
141
157
|
|
|
158
|
+
### Switch confirmation strategy to one-to-one
|
|
159
|
+
Use this when every sensitive action must consume its own confirmation.
|
|
160
|
+
```bash
|
|
161
|
+
openclaw bshield vine set confirmation.strategy one_to_one
|
|
162
|
+
```
|
|
163
|
+
Result: CLI confirms `confirmation.strategy = one_to_one`.
|
|
164
|
+
|
|
165
|
+
### Open interactive confirmation strategy selector
|
|
166
|
+
Use this when you prefer the TTY selector with `1:1` and `1:N` labels.
|
|
167
|
+
```bash
|
|
168
|
+
openclaw bshield vine confirmation
|
|
169
|
+
```
|
|
170
|
+
Result: CLI opens the interactive selector and updates strategy after confirmation.
|
|
171
|
+
|
|
142
172
|
### Allowlist one tool
|
|
143
173
|
Use this when one trusted tool should not trigger Vine escalation.
|
|
144
174
|
```bash
|
|
@@ -180,6 +210,13 @@ openclaw bshield vine set thresholds.forcedGuardTurns zero
|
|
|
180
210
|
```
|
|
181
211
|
Expected: CLI fails with integer validation message.
|
|
182
212
|
|
|
213
|
+
### Invalid confirmation strategy value
|
|
214
|
+
Use this check when a direct confirmation strategy write uses an unsupported value.
|
|
215
|
+
```bash
|
|
216
|
+
openclaw bshield vine set confirmation.strategy invalid
|
|
217
|
+
```
|
|
218
|
+
Expected: CLI fails and prints the allowed confirmation strategies.
|
|
219
|
+
|
|
183
220
|
## Related commands
|
|
184
221
|
- [index](README.md)
|
|
185
222
|
- [status](status.md)
|
|
@@ -16,6 +16,7 @@ Use these pages when you want guided execution rather than command reference.
|
|
|
16
16
|
|
|
17
17
|
- [secure session](secure-session.md): end-to-end first session with verification checkpoints
|
|
18
18
|
- [choose your profile](choose-profile.md): decide strict/balanced/minimal with practical checks
|
|
19
|
+
- [choose your Vine confirmation strategy](choose-vine-confirmation.md): decide when to use `1:1` or `1:N`
|
|
19
20
|
- [tune policy](tune-policy.md): configure adaptive and retention values safely
|
|
20
21
|
- [build custom rules](build-custom-rules.md): add, test, list, and remove organization-specific rules
|
|
21
22
|
- [audit-to-enforce rollout](audit-to-enforce-rollout.md): move from observation to active mitigation
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Choose the right Vine confirmation strategy for external-risk workflows"
|
|
3
|
+
read_when:
|
|
4
|
+
- You are deciding between one-to-one and one-to-many confirmation
|
|
5
|
+
- You want a practical Vine baseline before smoke tests or rollout
|
|
6
|
+
- You need to verify confirmation behavior from CLI and status output
|
|
7
|
+
title: "Choose Your Vine Confirmation Strategy"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `Choose Your Vine Confirmation Strategy`
|
|
11
|
+
|
|
12
|
+
This tutorial helps you choose and validate the Vine confirmation strategy without editing low-level config files.
|
|
13
|
+
Use it when you need a predictable human pause after external-content risk becomes active.
|
|
14
|
+
|
|
15
|
+
## Prerequisites
|
|
16
|
+
|
|
17
|
+
- Berry Shield installed and enabled
|
|
18
|
+
- Access to run `openclaw bshield` commands
|
|
19
|
+
- Vine layer enabled in the active runtime
|
|
20
|
+
|
|
21
|
+
## Step 1: Inspect current confirmation state
|
|
22
|
+
|
|
23
|
+
Use this command to inspect the active Vine confirmation strategy before changing anything.
|
|
24
|
+
```bash
|
|
25
|
+
openclaw bshield status
|
|
26
|
+
```
|
|
27
|
+
Expected:
|
|
28
|
+
- `Vine Confirmation` section is visible
|
|
29
|
+
- `Confirmation Strategy` is shown as `ONE_TO_ONE` or `ONE_TO_MANY`
|
|
30
|
+
|
|
31
|
+
## Step 2: Start with the default strategy
|
|
32
|
+
|
|
33
|
+
Use this command when you want the recommended general-purpose confirmation baseline.
|
|
34
|
+
```bash
|
|
35
|
+
openclaw bshield vine set confirmation.strategy one_to_many
|
|
36
|
+
```
|
|
37
|
+
Expected:
|
|
38
|
+
- CLI confirms `confirmation.strategy = one_to_many`
|
|
39
|
+
|
|
40
|
+
## Step 3: Verify the runtime state
|
|
41
|
+
|
|
42
|
+
Use this command to confirm the strategy is visible in status output.
|
|
43
|
+
```bash
|
|
44
|
+
openclaw bshield status
|
|
45
|
+
```
|
|
46
|
+
Expected:
|
|
47
|
+
- `Confirmation Strategy` is `ONE_TO_MANY`
|
|
48
|
+
- `ONE_TO_MANY` is marked `ACTIVE`
|
|
49
|
+
|
|
50
|
+
## Step 4: Try the interactive selector
|
|
51
|
+
|
|
52
|
+
Use this command when you want the TTY selector with `1:1` and `1:N` labels.
|
|
53
|
+
```bash
|
|
54
|
+
openclaw bshield vine confirmation
|
|
55
|
+
```
|
|
56
|
+
Expected:
|
|
57
|
+
- CLI opens the confirmation strategy selector
|
|
58
|
+
|
|
59
|
+
## Step 5: Switch to one-to-one when every action must pause
|
|
60
|
+
|
|
61
|
+
Use this command when each sensitive action should require its own human confirmation.
|
|
62
|
+
```bash
|
|
63
|
+
openclaw bshield vine set confirmation.strategy one_to_one
|
|
64
|
+
```
|
|
65
|
+
Expected:
|
|
66
|
+
- CLI confirms `confirmation.strategy = one_to_one`
|
|
67
|
+
|
|
68
|
+
## Step 6: Return to one-to-many for smoother operator flow
|
|
69
|
+
|
|
70
|
+
Use this command when you want one confirmation to unlock a short bounded sequence of sensitive actions.
|
|
71
|
+
```bash
|
|
72
|
+
openclaw bshield vine set confirmation.strategy one_to_many
|
|
73
|
+
```
|
|
74
|
+
Expected:
|
|
75
|
+
- CLI confirms `confirmation.strategy = one_to_many`
|
|
76
|
+
|
|
77
|
+
## Decision guide
|
|
78
|
+
|
|
79
|
+
- Choose `one_to_one` (`1:1`) when every sensitive action should stop and wait for a new human confirmation.
|
|
80
|
+
- Choose `one_to_many` (`1:N`) when the goal is to insert one visible human pause and then allow a short bounded sequence of related sensitive actions.
|
|
81
|
+
- Keep `one_to_many` as the default when operator experience matters and the bounded window is acceptable.
|
|
82
|
+
- Use `one_to_one` for higher-friction validation sessions or when you want the clearest action-by-action audit trail.
|
|
83
|
+
|
|
84
|
+
## Related pages
|
|
85
|
+
- [tutorial index](README.md)
|
|
86
|
+
- [Vine layer reference](../layers/vine.md)
|
|
87
|
+
- [vine command reference](../operation/cli/vine.md)
|
|
88
|
+
- [status command reference](../operation/cli/status.md)
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Navigation
|
|
93
|
+
- [Back to Tutorials Index](README.md)
|
|
94
|
+
- [Back to Wiki Index](../README.md)
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "berry-shield",
|
|
3
3
|
"name": "Berry Shield",
|
|
4
4
|
"description": "Security plugin that helps to block destructive commands, redact secrets and PII",
|
|
5
|
-
"version": "2026.3.
|
|
5
|
+
"version": "2026.3.20",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -173,6 +173,46 @@
|
|
|
173
173
|
},
|
|
174
174
|
"default": [],
|
|
175
175
|
"description": "Tool names exempt from Vine escalation"
|
|
176
|
+
},
|
|
177
|
+
"confirmation": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"additionalProperties": false,
|
|
180
|
+
"description": "Confirmation flow tuning for sensitive actions under Vine risk",
|
|
181
|
+
"properties": {
|
|
182
|
+
"strategy": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"enum": [
|
|
185
|
+
"one_to_one",
|
|
186
|
+
"one_to_many"
|
|
187
|
+
],
|
|
188
|
+
"default": "one_to_many",
|
|
189
|
+
"description": "Confirmation strategy: 1:1 = one code per action, 1:N = one code for multiple actions within a short window"
|
|
190
|
+
},
|
|
191
|
+
"codeTtlSeconds": {
|
|
192
|
+
"type": "integer",
|
|
193
|
+
"minimum": 1,
|
|
194
|
+
"default": 180,
|
|
195
|
+
"description": "Confirmation code time-to-live in seconds"
|
|
196
|
+
},
|
|
197
|
+
"maxAttempts": {
|
|
198
|
+
"type": "integer",
|
|
199
|
+
"minimum": 1,
|
|
200
|
+
"default": 3,
|
|
201
|
+
"description": "Maximum invalid code attempts per challenge"
|
|
202
|
+
},
|
|
203
|
+
"windowSeconds": {
|
|
204
|
+
"type": "integer",
|
|
205
|
+
"minimum": 1,
|
|
206
|
+
"default": 120,
|
|
207
|
+
"description": "Window lifetime in seconds when strategy is 1:N"
|
|
208
|
+
},
|
|
209
|
+
"maxActionsPerWindow": {
|
|
210
|
+
"type": "integer",
|
|
211
|
+
"minimum": 1,
|
|
212
|
+
"default": 3,
|
|
213
|
+
"description": "Maximum sensitive actions allowed during 1:N confirmation window"
|
|
214
|
+
}
|
|
215
|
+
}
|
|
176
216
|
}
|
|
177
217
|
}
|
|
178
218
|
},
|
|
@@ -290,4 +330,4 @@
|
|
|
290
330
|
"sensitive": false
|
|
291
331
|
}
|
|
292
332
|
}
|
|
293
|
-
}
|
|
333
|
+
}
|