@gendigital/sage-opencode 0.9.0 → 0.11.0

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.
Files changed (49) hide show
  1. package/README.md +60 -71
  2. package/dist/bundled-dirs.d.ts +1 -1
  3. package/dist/bundled-dirs.d.ts.map +1 -1
  4. package/dist/bundled-dirs.js +1 -1
  5. package/dist/bundled-dirs.js.map +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +83 -18
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp-server.cjs +31776 -0
  10. package/dist/mcp-server.cjs.map +7 -0
  11. package/dist/plugin-discovery.js +1 -1
  12. package/dist/plugin-discovery.js.map +1 -1
  13. package/dist/startup-scan.d.ts.map +1 -1
  14. package/dist/startup-scan.js +3 -2
  15. package/dist/startup-scan.js.map +1 -1
  16. package/dist/tool-handler.d.ts +1 -1
  17. package/dist/tool-handler.d.ts.map +1 -1
  18. package/dist/tool-handler.js +61 -6
  19. package/dist/tool-handler.js.map +1 -1
  20. package/package.json +6 -4
  21. package/resources/threats/agent-layer.yaml +186 -0
  22. package/resources/threats/commands.yaml +24 -53
  23. package/resources/threats/credentials.yaml +12 -20
  24. package/resources/threats/dummy.yaml +22 -33
  25. package/resources/threats/files.yaml +34 -53
  26. package/resources/threats/mac-commands.yaml +20 -47
  27. package/resources/threats/mac-credentials.yaml +4 -12
  28. package/resources/threats/mac-files.yaml +5 -15
  29. package/resources/threats/mac-obfuscation.yaml +6 -13
  30. package/resources/threats/mac-persistence.yaml +11 -20
  31. package/resources/threats/mac-supply-chain.yaml +5 -8
  32. package/resources/threats/mitre.yaml +105 -167
  33. package/resources/threats/obfuscation.yaml +7 -15
  34. package/resources/threats/persistence.yaml +10 -17
  35. package/resources/threats/prompt-injection.yaml +94 -44
  36. package/resources/threats/self-defense.yaml +8 -12
  37. package/resources/threats/supply_chain.yaml +1 -2
  38. package/resources/threats/urls.yaml +9 -14
  39. package/resources/threats/win-commands.yaml +46 -106
  40. package/resources/threats/win-credentials.yaml +15 -25
  41. package/resources/threats/win-files.yaml +10 -20
  42. package/resources/threats/win-obfuscation.yaml +21 -37
  43. package/resources/threats/win-persistence.yaml +8 -16
  44. package/resources/threats/win-supply-chain.yaml +2 -3
  45. package/dist/logger-adaptor.d.ts +0 -15
  46. package/dist/logger-adaptor.d.ts.map +0 -1
  47. package/dist/logger-adaptor.js +0 -32
  48. package/dist/logger-adaptor.js.map +0 -1
  49. /package/resources/{allowlists → trusted-domains}/trusted-installer-domains.yaml +0 -0
@@ -1,14 +1,13 @@
1
1
  # Command threat patterns for Sage
2
2
  # Author: Gen Digital Inc.
3
3
  # License: DRL-1.1 (see threats/LICENSE)
4
- # Schema: id, category, severity, confidence, action, pattern, match_on, title, expires_at, revoked
4
+ # Schema: id, category, severity, confidence, pattern, match_on, title, expires_at, revoked, flags
5
5
 
6
6
  # --- Pipe to shell (Remote Code Execution) ---
7
7
  - id: "CLT-CMD-001"
8
8
  category: tool
9
9
  severity: critical
10
10
  confidence: 0.95
11
- action: block
12
11
  pattern: "curl\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
13
12
  match_on: command
14
13
  title: "Remote code execution via curl pipe to shell"
@@ -19,7 +18,6 @@
19
18
  category: tool
20
19
  severity: critical
21
20
  confidence: 0.95
22
- action: block
23
21
  pattern: "wget\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
24
22
  match_on: command
25
23
  title: "Remote code execution via wget pipe to shell"
@@ -31,8 +29,7 @@
31
29
  category: tool
32
30
  severity: critical
33
31
  confidence: 0.90
34
- action: block
35
- pattern: "/dev/tcp/"
32
+ pattern: "\\b(bash|sh|zsh|ksh|dash)\\s+-i\\b[\\s\\S]{0,160}/dev/tcp/"
36
33
  match_on: command
37
34
  title: "Reverse shell via /dev/tcp"
38
35
  expires_at: null
@@ -42,7 +39,6 @@
42
39
  category: tool
43
40
  severity: critical
44
41
  confidence: 0.90
45
- action: block
46
42
  pattern: "\\bnc\\b.*\\s-e\\s"
47
43
  match_on: command
48
44
  title: "Reverse shell via netcat -e"
@@ -53,7 +49,6 @@
53
49
  category: tool
54
50
  severity: critical
55
51
  confidence: 0.85
56
- action: block
57
52
  pattern: "bash\\s+-i\\s+>\\s*&\\s*/dev/"
58
53
  match_on: command
59
54
  title: "Interactive reverse shell via bash"
@@ -65,7 +60,6 @@
65
60
  category: tool
66
61
  severity: critical
67
62
  confidence: 0.95
68
- action: block
69
63
  pattern: "\\brm\\s+(-[a-zA-Z]*f[a-zA-Z]*\\s+)?(-[a-zA-Z]*r[a-zA-Z]*\\s+)?/(\\s|$|[;&|*])|\\brm\\s+(-[a-zA-Z]*r[a-zA-Z]*\\s+)?(-[a-zA-Z]*f[a-zA-Z]*\\s+)?/(\\s|$|[;&|*])|\\brm\\s+-[a-zA-Z]*rf[a-zA-Z]*\\s+/(\\s|$|[;&|*])"
70
64
  match_on: command
71
65
  title: "Recursive forced deletion from root"
@@ -76,7 +70,6 @@
76
70
  category: tool
77
71
  severity: critical
78
72
  confidence: 0.95
79
- action: block
80
73
  pattern: "\\bmkfs\\b"
81
74
  match_on: command
82
75
  title: "Filesystem format command"
@@ -85,9 +78,8 @@
85
78
 
86
79
  - id: "CLT-CMD-008"
87
80
  category: tool
88
- severity: high
81
+ severity: warning
89
82
  confidence: 0.85
90
- action: block
91
83
  pattern: "\\bdd\\s+if=.*of=/dev/"
92
84
  match_on: command
93
85
  title: "Direct disk write via dd"
@@ -98,7 +90,6 @@
98
90
  category: tool
99
91
  severity: critical
100
92
  confidence: 0.90
101
- action: block
102
93
  pattern: "\\bshred\\b"
103
94
  match_on: command
104
95
  title: "Secure file destruction via shred"
@@ -110,7 +101,6 @@
110
101
  category: tool
111
102
  severity: critical
112
103
  confidence: 0.90
113
- action: block
114
104
  pattern: "(curl|wget)\\s[\\s\\S]*?(&&|;)\\s*chmod\\s+\\+x"
115
105
  match_on: command
116
106
  title: "Download and execute chain"
@@ -120,9 +110,8 @@
120
110
  # --- Privilege escalation ---
121
111
  - id: "CLT-CMD-011"
122
112
  category: tool
123
- severity: high
124
- confidence: 0.80
125
- action: require_approval
113
+ severity: warning
114
+ confidence: 0.60
126
115
  pattern: "\\bchmod\\s+777\\b"
127
116
  match_on: command
128
117
  title: "Overly permissive file permissions"
@@ -131,9 +120,8 @@
131
120
 
132
121
  - id: "CLT-CMD-012"
133
122
  category: tool
134
- severity: high
135
- confidence: 0.80
136
- action: require_approval
123
+ severity: warning
124
+ confidence: 0.60
137
125
  pattern: "NOPASSWD"
138
126
  match_on: command
139
127
  title: "Passwordless sudo configuration"
@@ -143,9 +131,8 @@
143
131
  # --- Data exfiltration ---
144
132
  - id: "CLT-CMD-013"
145
133
  category: network_egress
146
- severity: high
147
- confidence: 0.80
148
- action: require_approval
134
+ severity: warning
135
+ confidence: 0.60
149
136
  pattern: "curl\\s[^|;]*(-d|--data|--data-binary)\\s\\S*(/etc/passwd|/etc/shadow|\\.ssh/|id_rsa|credentials|secrets)"
150
137
  match_on: command
151
138
  title: "Possible data exfiltration of sensitive files"
@@ -157,7 +144,6 @@
157
144
  category: tool
158
145
  severity: critical
159
146
  confidence: 0.95
160
- action: block
161
147
  pattern: "\\bsudo\\s+(curl|wget)\\s[^|]*\\|\\s*(bash|sh|zsh|ksh|dash)"
162
148
  match_on: command
163
149
  title: "Privileged pipe-to-shell (sudo curl/wget piped to shell)"
@@ -171,9 +157,8 @@
171
157
  # bounded non-greedy quantifier to avoid catastrophic backtracking.
172
158
  - id: "CLT-CMD-015"
173
159
  category: tool
174
- severity: high
175
- confidence: 0.80
176
- action: require_approval
160
+ severity: warning
161
+ confidence: 0.60
177
162
  pattern: "python[3]?\\s+-c\\s+[\"'][\\s\\S]{0,2048}?(?:os\\.(?:system|popen|exec[lv]?[ep]?e?)|subprocess\\.(?:run|call|Popen|check_output|check_call|getoutput|getstatusoutput)|__import__)\\s*\\("
178
163
  match_on: command
179
164
  title: "Python one-liner invoking shell/exec/subprocess call"
@@ -185,7 +170,6 @@
185
170
  category: tool
186
171
  severity: critical
187
172
  confidence: 0.90
188
- action: block
189
173
  pattern: "\\bbash\\s+<\\(\\s*(curl|wget)\\b"
190
174
  match_on: command
191
175
  title: "Process substitution executing remote content"
@@ -194,9 +178,8 @@
194
178
 
195
179
  - id: "CLT-CMD-017"
196
180
  category: tool
197
- severity: high
181
+ severity: warning
198
182
  confidence: 0.85
199
- action: block
200
183
  pattern: "\\beval\\b[^;|]*\\b(curl|wget)\\b"
201
184
  match_on: command
202
185
  title: "Eval executing remote download command"
@@ -205,13 +188,12 @@
205
188
 
206
189
  - id: "CLT-CMD-018"
207
190
  category: tool
208
- severity: high
191
+ severity: warning
209
192
  confidence: 0.85
210
- action: block
211
193
  # The lookarounds prevent matching short-option flags like `du -sh` or
212
194
  # identifiers like `shell`/`bashrc`; only standalone command invocations
213
195
  # (preceded by whitespace, `/`, etc.) are flagged.
214
- pattern: "\\bxargs\\b[^|;]*(?<![-\\w])(curl|wget|bash|sh)(?![-\\w])"
196
+ pattern: "\\bxargs\\b[^|;\\r\\n]{0,400}(?:(?<![-\\w])(bash|sh)(?![-\\w])(?:\\s+-[\\w]*c\\b\\s+(?:\"(?!\\s*(?:head|cat|wc)\\b)[^\"\\r\\n]{0,240}(?:\\{\\}|\\$[@*]|\\$\\d)[^\"\\r\\n]{0,240}\"|'(?!\\s*(?:head|cat|wc)\\b)[^'\\r\\n]{0,240}(?:\\{\\}|\\$[@*]|\\$\\d)[^'\\r\\n]{0,240}')|(?!\\s+-[\\w]*c\\b))|(?<![-\\w])(curl|wget)(?![-\\w])[^|;\\r\\n]{0,400}(?:-d|--data|--data-binary|--upload-file|-T|--post-file|--post-data|--body-file)\\b)"
215
197
  match_on: command
216
198
  title: "xargs dispatching download or shell execution"
217
199
  expires_at: null
@@ -219,9 +201,8 @@
219
201
 
220
202
  - id: "CLT-CMD-019"
221
203
  category: tool
222
- severity: high
204
+ severity: warning
223
205
  confidence: 0.85
224
- action: block
225
206
  pattern: "\\bfind\\b[^|;]*-exec\\s+(bash|sh|curl|wget)\\b"
226
207
  match_on: command
227
208
  title: "find -exec executing shell or download commands"
@@ -231,9 +212,8 @@
231
212
  # --- DNS exfiltration ---
232
213
  - id: "CLT-CMD-020"
233
214
  category: network_egress
234
- severity: high
215
+ severity: warning
235
216
  confidence: 0.80
236
- action: block
237
217
  pattern: "\\b(nslookup|dig|host)\\b[^|;]*\\$\\([^)]+\\)\\.[a-zA-Z]"
238
218
  match_on: command
239
219
  title: "DNS exfiltration via command substitution as subdomain label"
@@ -242,9 +222,8 @@
242
222
 
243
223
  - id: "CLT-CMD-021"
244
224
  category: network_egress
245
- severity: high
225
+ severity: warning
246
226
  confidence: 0.80
247
- action: block
248
227
  pattern: "\\b(nslookup|dig|host)\\b[^|;]*`[^`]+`\\.[a-zA-Z]"
249
228
  match_on: command
250
229
  title: "DNS exfiltration via backtick substitution as subdomain label"
@@ -254,9 +233,8 @@
254
233
  # --- Loop-based indirect execution ---
255
234
  - id: "CLT-CMD-022"
256
235
  category: tool
257
- severity: high
236
+ severity: warning
258
237
  confidence: 0.80
259
- action: block
260
238
  pattern: "\\b(while|for)\\b[^;]*;\\s*do[^;]*(\\b(bash|sh)\\s+-c\\b|\\b(curl|wget)\\b[^;]*\\|\\s*(?:sudo\\s+)?(?:env\\s+)?(?:[^\\s\"']*[\\\\/])?(bash|sh|zsh|ksh|dash)\\b|\\b(curl|wget)\\b[^;]*(?:(-d|--data|--data-binary)\\s+['\\\"]?@\\S+|(--upload-file|-T)\\s+['\\\"]?\\S+))"
261
239
  match_on: command
262
240
  title: "Loop executing shell or download commands"
@@ -270,7 +248,6 @@
270
248
  category: tool
271
249
  severity: critical
272
250
  confidence: 0.90
273
- action: block
274
251
  pattern: "python[23]?\\s+-c.*socket.*connect.*(\\/bin\\/zsh|\\/bin\\/sh|\\/bin\\/bash)"
275
252
  match_on: command
276
253
  title: "Python reverse shell via socket"
@@ -282,7 +259,6 @@
282
259
  category: tool
283
260
  severity: critical
284
261
  confidence: 0.90
285
- action: block
286
262
  pattern: "ruby\\s+-e.*TCPSocket.*exec.*(\\/bin\\/zsh|\\/bin\\/sh)"
287
263
  match_on: command
288
264
  title: "Ruby reverse shell via TCPSocket"
@@ -294,7 +270,6 @@
294
270
  category: tool
295
271
  severity: critical
296
272
  confidence: 0.90
297
- action: block
298
273
  pattern: "\\bzsh\\s+-c\\b.*\\b(exec|socket|/dev/tcp)\\b"
299
274
  match_on: command
300
275
  title: "Zsh reverse shell pattern"
@@ -306,7 +281,6 @@
306
281
  category: tool
307
282
  severity: critical
308
283
  confidence: 0.95
309
- action: block
310
284
  pattern: "\\brm\\s+(-[a-zA-Z]+\\s+)*-[a-zA-Z]*[rR][a-zA-Z]*(\\s+-[a-zA-Z]+)*\\s+/(home|Users|etc|usr|var|boot|bin|sbin|lib|lib64|opt|root|System|Applications|Library|Volumes|private|mnt)\\b/?(\\s|$|[;&|])"
311
285
  match_on: command
312
286
  title: "Recursive deletion of critical system directory"
@@ -316,9 +290,8 @@
316
290
  # --- Deletion of .env files ---
317
291
  - id: "CLT-CMD-027"
318
292
  category: tool
319
- severity: high
320
- confidence: 0.85
321
- action: require_approval
293
+ severity: warning
294
+ confidence: 0.60
322
295
  pattern: "\\brm\\s+(-{1,2}[\\w-]+(=\\S+)?\\s+)*(\\S+[\\\\/])?\\.env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.(local|production|prod|staging|stage|development|dev|test))?\\b"
323
296
  match_on: command
324
297
  title: "Deletion of .env file"
@@ -328,9 +301,8 @@
328
301
  # --- Deletion of database files ---
329
302
  - id: "CLT-CMD-028"
330
303
  category: tool
331
- severity: high
332
- confidence: 0.85
333
- action: require_approval
304
+ severity: warning
305
+ confidence: 0.60
334
306
  pattern: "\\brm\\s+(-{1,2}[\\w-]+(=\\S+)?\\s+)*\\S+\\.(db|sqlite|sqlite3)\\b"
335
307
  match_on: command
336
308
  title: "Deletion of database file"
@@ -340,9 +312,8 @@
340
312
  # --- Deletion of .git directory ---
341
313
  - id: "CLT-CMD-029"
342
314
  category: tool
343
- severity: high
344
- confidence: 0.90
345
- action: require_approval
315
+ severity: warning
316
+ confidence: 0.60
346
317
  pattern: "\\b(rm|del|rmdir|rd|Remove-Item|unlink)\\b.*(\\s|[\\\\/])\\.git(\\s|[\\\\/]|$)"
347
318
  case_insensitive: true
348
319
  match_on: command
@@ -7,7 +7,6 @@
7
7
  category: secrets
8
8
  severity: critical
9
9
  confidence: 0.80
10
- action: block
11
10
  pattern: "(sk-[a-zA-Z0-9_-]{20,}|sk-proj-[a-zA-Z0-9_-]{20,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|ghp_[0-9a-zA-Z]{36}|gho_[0-9a-zA-Z]{36}|glpat-[0-9a-zA-Z_-]{20,}|xox[baprs]-[0-9a-zA-Z-]+)"
12
11
  match_on: [command, content]
13
12
  title: "Known API key prefix detected"
@@ -17,9 +16,8 @@
17
16
  # --- Export of credential env vars ---
18
17
  - id: "CLT-CRED-002"
19
18
  category: secrets
20
- severity: high
21
- confidence: 0.80
22
- action: require_approval
19
+ severity: warning
20
+ confidence: 0.60
23
21
  pattern: "\\bexport\\s+[A-Z_]*(API_KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*="
24
22
  match_on: command
25
23
  title: "Export of environment variable with credential keyword"
@@ -29,9 +27,8 @@
29
27
  # --- .env file writes ---
30
28
  - id: "CLT-CRED-003"
31
29
  category: secrets
32
- severity: high
33
- confidence: 0.80
34
- action: require_approval
30
+ severity: warning
31
+ confidence: 0.60
35
32
  pattern: "(>>|>)\\s*\\.env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.local|\\.production|\\.prod|\\.staging|\\.stage|\\.development|\\.dev|\\.test)?\\b"
36
33
  match_on: command
37
34
  title: "Write/append to .env file (potential credential exposure)"
@@ -41,9 +38,8 @@
41
38
  # --- Reading credential files ---
42
39
  - id: "CLT-CRED-004"
43
40
  category: secrets
44
- severity: high
45
- confidence: 0.80
46
- action: require_approval
41
+ severity: warning
42
+ confidence: 0.60
47
43
  pattern: "\\b(cat|less|more|head|tail)\\s+.*(\\.(env(?!\\S*\\.(example|sample|template|dist)\\b)(\\.(local|production|prod|staging|stage|development|dev|test))?)|credentials|\\.aws/credentials|\\.ssh/id_rsa|\\.ssh/id_ed25519|\\.netrc|\\.pgpass)"
48
44
  match_on: command
49
45
  title: "Reading credential or secret file"
@@ -53,9 +49,8 @@
53
49
  # --- Plaintext credential assignment ---
54
50
  - id: "CLT-CRED-005"
55
51
  category: secrets
56
- severity: high
57
- confidence: 0.85
58
- action: require_approval
52
+ severity: warning
53
+ confidence: 0.60
59
54
  pattern: "\\b(PASSWORD|API_SECRET|SECRET_KEY|PRIVATE_KEY|DB_PASSWORD|MYSQL_PASSWORD|POSTGRES_PASSWORD)=[\"']?[^\\s\"']{8,}"
60
55
  match_on: [command, content]
61
56
  title: "Plaintext credential assignment detected"
@@ -67,7 +62,6 @@
67
62
  category: secrets
68
63
  severity: critical
69
64
  confidence: 0.92
70
- action: block
71
65
  pattern: "(github_pat_[0-9a-zA-Z_]{22,}|SG\\.[0-9a-zA-Z_-]{22,}\\.[0-9a-zA-Z_-]{22,}|pk_live_[0-9a-zA-Z]{24,}|sk_live_[0-9a-zA-Z]{24,}|rk_live_[0-9a-zA-Z]{24,})"
72
66
  match_on: [command, content]
73
67
  title: "Long-form API key pattern detected (GitHub PAT, SendGrid, Stripe)"
@@ -77,9 +71,8 @@
77
71
  # --- Copy/move/link secret files ---
78
72
  - id: "CLT-CRED-007"
79
73
  category: secrets
80
- severity: high
81
- confidence: 0.80
82
- action: require_approval
74
+ severity: warning
75
+ confidence: 0.60
83
76
  # Protected files: .env*, .aws/credentials, .ssh/(id_rsa|id_ed25519|id_ecdsa|id_dsa),
84
77
  # .netrc, .pgpass, .npmrc, .pypirc, key.properties, .docker/config.json,
85
78
  # kubeconfig, .kube/config, master.key, credentials.yml
@@ -92,9 +85,8 @@
92
85
  # --- Archive secret files ---
93
86
  - id: "CLT-CRED-008"
94
87
  category: secrets
95
- severity: high
96
- confidence: 0.80
97
- action: require_approval
88
+ severity: warning
89
+ confidence: 0.60
98
90
  # Protected files: .env*, .aws/credentials, .ssh/(id_rsa|id_ed25519|id_ecdsa|id_dsa),
99
91
  # .netrc, .pgpass, .npmrc, .pypirc, key.properties, .docker/config.json,
100
92
  # kubeconfig, .kube/config, master.key, credentials.yml
@@ -24,7 +24,6 @@
24
24
  category: testing
25
25
  severity: critical
26
26
  confidence: 0.95
27
- action: block
28
27
  pattern: "__sage_test_deny_cmd_a75bf229__"
29
28
  match_on: command
30
29
  title: "[TEST] Canary deny command (alpha)"
@@ -35,7 +34,6 @@
35
34
  category: testing
36
35
  severity: critical
37
36
  confidence: 0.95
38
- action: block
39
37
  pattern: "__sage_test_deny_run_c3d91e4a__"
40
38
  match_on: command
41
39
  title: "[TEST] Canary deny command (bravo)"
@@ -44,9 +42,8 @@
44
42
 
45
43
  - id: "DUMMY-CMD-ASK-001"
46
44
  category: testing
47
- severity: high
48
- confidence: 0.90
49
- action: require_approval
45
+ severity: warning
46
+ confidence: 0.60
50
47
  pattern: "__sage_test_ask_cmd_8f2e6b71__"
51
48
  match_on: command
52
49
  title: "[TEST] Canary approval command (alpha)"
@@ -55,9 +52,8 @@
55
52
 
56
53
  - id: "DUMMY-CMD-ASK-002"
57
54
  category: testing
58
- severity: high
59
- confidence: 0.90
60
- action: require_approval
55
+ severity: warning
56
+ confidence: 0.60
61
57
  pattern: "__sage_test_ask_run_d4a09c53__"
62
58
  match_on: command
63
59
  title: "[TEST] Canary approval command (bravo)"
@@ -66,14 +62,14 @@
66
62
 
67
63
  - id: "DUMMY-CMD-LOG-001"
68
64
  category: testing
69
- severity: low
70
- confidence: 0.90
71
- action: log
65
+ severity: info
66
+ confidence: 0.10
72
67
  pattern: "__sage_test_log_cmd_1b7e3f82__"
73
68
  match_on: command
74
69
  title: "[TEST] Canary log-only command"
75
70
  expires_at: null
76
71
  revoked: false
72
+ flags: ["report"]
77
73
 
78
74
  # ─── File-path patterns (Write / Edit / Read / Delete tools) ────────
79
75
 
@@ -81,7 +77,6 @@
81
77
  category: testing
82
78
  severity: critical
83
79
  confidence: 0.95
84
- action: block
85
80
  pattern: "__sage_test_deny_file_e6c4a918__"
86
81
  match_on: file_path
87
82
  title: "[TEST] Canary deny file path"
@@ -90,9 +85,8 @@
90
85
 
91
86
  - id: "DUMMY-FILE-ASK-001"
92
87
  category: testing
93
- severity: high
94
- confidence: 0.90
95
- action: require_approval
88
+ severity: warning
89
+ confidence: 0.60
96
90
  pattern: "__sage_test_ask_file_52fd7b36__"
97
91
  match_on: file_path
98
92
  title: "[TEST] Canary approval file path"
@@ -101,14 +95,14 @@
101
95
 
102
96
  - id: "DUMMY-FILE-LOG-001"
103
97
  category: testing
104
- severity: low
105
- confidence: 0.90
106
- action: log
98
+ severity: info
99
+ confidence: 0.10
107
100
  pattern: "__sage_test_log_file_9a13de74__"
108
101
  match_on: file_path
109
102
  title: "[TEST] Canary log-only file path"
110
103
  expires_at: null
111
104
  revoked: false
105
+ flags: ["report"]
112
106
 
113
107
  # ─── Content patterns (Write / Edit tools — file body) ──────────────
114
108
 
@@ -116,7 +110,6 @@
116
110
  category: testing
117
111
  severity: critical
118
112
  confidence: 0.95
119
- action: block
120
113
  pattern: "__SAGE_TEST_DENY_CONTENT_3c8f15b7__"
121
114
  match_on: content
122
115
  title: "[TEST] Canary deny content"
@@ -125,9 +118,8 @@
125
118
 
126
119
  - id: "DUMMY-CONTENT-ASK-001"
127
120
  category: testing
128
- severity: high
129
- confidence: 0.90
130
- action: require_approval
121
+ severity: warning
122
+ confidence: 0.60
131
123
  pattern: "__SAGE_TEST_ASK_CONTENT_7d4ea2c9__"
132
124
  match_on: content
133
125
  title: "[TEST] Canary approval content"
@@ -136,14 +128,14 @@
136
128
 
137
129
  - id: "DUMMY-CONTENT-LOG-001"
138
130
  category: testing
139
- severity: low
140
- confidence: 0.90
141
- action: log
131
+ severity: info
132
+ confidence: 0.10
142
133
  pattern: "__SAGE_TEST_LOG_CONTENT_f0b683d1__"
143
134
  match_on: content
144
135
  title: "[TEST] Canary log-only content"
145
136
  expires_at: null
146
137
  revoked: false
138
+ flags: ["report"]
147
139
 
148
140
  # ─── URL patterns (WebFetch / Bash / Write content) ─────────────────
149
141
  # Uses .test TLD (RFC 2606 reserved, never resolves) for safety.
@@ -152,7 +144,6 @@
152
144
  category: testing
153
145
  severity: critical
154
146
  confidence: 0.95
155
- action: block
156
147
  pattern: "sage-canary-deny-4e91ca37\\.test"
157
148
  match_on: url
158
149
  title: "[TEST] Canary deny URL"
@@ -161,9 +152,8 @@
161
152
 
162
153
  - id: "DUMMY-URL-ASK-001"
163
154
  category: testing
164
- severity: high
165
- confidence: 0.90
166
- action: require_approval
155
+ severity: warning
156
+ confidence: 0.60
167
157
  pattern: "sage-canary-ask-b26d80f5\\.test"
168
158
  match_on: url
169
159
  title: "[TEST] Canary approval URL"
@@ -172,14 +162,14 @@
172
162
 
173
163
  - id: "DUMMY-URL-LOG-001"
174
164
  category: testing
175
- severity: low
176
- confidence: 0.90
177
- action: log
165
+ severity: info
166
+ confidence: 0.10
178
167
  pattern: "sage-canary-log-65f3d7a4\\.test"
179
168
  match_on: url
180
169
  title: "[TEST] Canary log-only URL"
181
170
  expires_at: null
182
171
  revoked: false
172
+ flags: ["report"]
183
173
 
184
174
  # ─── Domain pattern (verifies domain→url routing in heuristics) ─────
185
175
 
@@ -187,7 +177,6 @@
187
177
  category: testing
188
178
  severity: critical
189
179
  confidence: 0.95
190
- action: block
191
180
  pattern: "sage-canary-domain-0c82eb16\\.test"
192
181
  match_on: domain
193
182
  title: "[TEST] Canary deny domain"