mirror of
https://github.com/akitaonrails/ai-memory.git
synced 2026-10-02 03:24:46 +08:00
Review of #961 found the ported TypeScript matcher claimed more than it enforced. Both matchers now: - recognize OpenClaw's and Devin's `exec` shell tool, and the TS list gains the native aliases (`shell_command`, `terminal`, `execute_bash`, `execute_cmd`); - resolve relative arguments from a shell tool's `workdir` (OpenCode `bash`, OpenClaw `exec`, Codex `shell`) instead of the event cwd; - treat `dir/**` as covering `dir` itself when `dir` holds a glob, as the TS already did; Rust charges that match to its budget. TS `captureStartsWith` walks only the prefix instead of spreading both strings per pattern and argument, and `captureGlob` reuses `captureCharEq`. The shell drop/keep tables move into a `shell` section of the shared capture-policy fixture that both `shell_fixture_vectors` and the Node runtime evidence execute, with tool-alias, workdir, glob-directory and Windows vectors. The Linux CI test job installs Node 24 and runs the Node evidence with `--ignored`, which now fails instead of skipping when Node cannot strip types. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
10 KiB
JSON
103 lines
10 KiB
JSON
{
|
|
"note": "Cross-language expected capture-policy vectors. All sentinel strings are test-only.",
|
|
"normalization": [
|
|
{"pattern":"secret/**","candidate":"secret","cwd":"/repo","match":true},
|
|
{"pattern":"secret/**","candidate":"a/../secret/file","cwd":"/repo","match":true},
|
|
{"pattern":"/**","candidate":"/","cwd":"/repo","match":true},
|
|
{"pattern":"C:/**","candidate":"C:/","cwd":"C:/","match":true},
|
|
{"pattern":"\\\\server\\share\\**","candidate":"//SERVER/SHARE","cwd":"C:/","match":true},
|
|
{"pattern":"C:\\Secret\\**","candidate":"c:/SECRET","cwd":"C:/","match":true},
|
|
{"pattern":"\\\\server\\share\\x","candidate":"//SERVER/SHARE/X","cwd":"C:/","match":true},
|
|
{"pattern":"unicode/?.txt","candidate":"unicode/é.txt","cwd":"/repo","match":true},
|
|
{"pattern":"foo..bar","candidate":"foo..bar","cwd":"/repo","match":true},
|
|
{"pattern":"docs/a?r/**","candidate":"docs/adr","cwd":"/repo","match":true},
|
|
{"pattern":"docs/a?r/**","candidate":"docs/adrx","cwd":"/repo","match":false}
|
|
],
|
|
"decisions": [
|
|
{"agent":"claude-code","payload":{"tool_name":"Edit","tool_input":{"file_path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"codex","payload":{"tool_name":"Edit","tool_input":{"file_path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"cursor","payload":{"tool_name":"Edit","tool_input":{"file_path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"gemini-cli","payload":{"tool_name":"Edit","tool_input":{"file_path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"devin","payload":{"tool_name":"Edit","tool_input":{"file_path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"kiro-cli","payload":{"tool_name":"fs_write","tool_input":{"command":"create","path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"kiro-cli","payload":{"tool_name":"read","tool_input":{"operations":[{"mode":"Line","path":"public"},{"mode":"Line","path":"secret/a"}]}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":2},
|
|
{"agent":"kiro-cli","payload":{"tool_name":"read","tool_input":{"operations":[]}},"disposition":"metadata-only","tool_family":"file","extraction_state":"missing-or-malformed","path_count":0},
|
|
{"agent":"kiro-cli","payload":{"tool_name":"execute_bash","tool_input":{"command":"cat secret/a"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"kiro-cli","payload":{"tool_name":"execute_bash","tool_input":{"command":"cat public/a"}},"disposition":"keep","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"grok","payload":{"toolName":"Edit","toolInput":{"filePath":"secret/a"},"callID":"safe-1"},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"zero","payload":{"toolName":"Edit","input":{"path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"antigravity-cli","payload":{"toolCall":{"name":"Edit","args":{"path":"secret/a"}}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"open-code","payload":{"tool":"Edit","args":{"path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"omp","payload":{"tool":"Edit","args":{"path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"pi","payload":{"tool":"Edit","args":{"path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"openclaw","payload":{"tool":"Edit","args":{"path":"secret/a"}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":1},
|
|
{"agent":"open-code","payload":{"tool":"bash","args":{"command":"cat secret/a | head"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"omp","payload":{"tool":"bash","args":{"command":"cat secret/*"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"pi","payload":{"tool":"bash","args":{"command":"cat 'secret/a b'"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"openclaw","payload":{"tool":"exec","args":{"command":"wc -l <secret/a"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"open-code","payload":{"tool":"bash","args":{"command":"cat public/a *.md"}},"disposition":"keep","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"openclaw","payload":{"tool":"exec","args":{"command":"git diff"}},"disposition":"keep","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"Edit","tool_input":null},"disposition":"metadata-only","tool_family":"file","extraction_state":"missing-or-malformed","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"Edit","tool_input":{"path":" "}},"disposition":"metadata-only","tool_family":"file","extraction_state":"missing-or-malformed","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"MultiEdit","tool_input":{"edits":[{"path":"public"},{"path":"secret/a"}]}},"disposition":"drop","tool_family":"file","extraction_state":"extracted","path_count":2},
|
|
{"agent":"codex","payload":{"tool_name":"Search","tool_input":{}},"disposition":"drop","tool_family":"search-list","extraction_state":"not-applicable","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"Bash","tool_input":{"command":"secret/a"}},"disposition":"drop","tool_family":"non-file","extraction_state":"extracted","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"FutureTool","tool_input":{"path":"secret/a"}},"disposition":"keep","tool_family":"unknown","extraction_state":"extracted","path_count":0},
|
|
{"agent":"codex","payload":{"tool_name":"Edit","tool_input":{"nested":{"path":"secret/a"}}},"disposition":"metadata-only","tool_family":"file","extraction_state":"missing-or-malformed","path_count":0}
|
|
],
|
|
"shell": {
|
|
"note": "Shell-tool vectors run by both matchers. `{root}` is the marker directory, `cwd` is relative to it, and `command` is shorthand for a `bash` payload.",
|
|
"ignore_paths": ["docs/adr/**","~/notes/**","docs/n?tes/**","C:/Secret/**"],
|
|
"vectors": [
|
|
{"command":"cat docs/adr/0001.md","disposition":"drop"},
|
|
{"command":"cat ./docs/adr/0001.md","disposition":"drop"},
|
|
{"command":"cat {root}/docs/adr/0001.md","disposition":"drop"},
|
|
{"command":"cat ../docs/adr/0001.md","cwd":"sub","disposition":"drop"},
|
|
{"command":"cat docs/adr/*.md","disposition":"drop"},
|
|
{"command":"cat docs/*/0001.md","disposition":"drop"},
|
|
{"command":"ls docs/*","disposition":"drop"},
|
|
{"command":"cat 'docs/adr/a b.md'","disposition":"drop"},
|
|
{"command":"cat \"docs/adr/a b.md\"","disposition":"drop"},
|
|
{"command":"cat docs/adr/a\\ b.md","disposition":"drop"},
|
|
{"command":"head -n5 docs/adr/x.md | wc -l","disposition":"drop"},
|
|
{"command":"grep --file=docs/adr/x.md pattern","disposition":"drop"},
|
|
{"command":"FILE=docs/adr/x.md sh -c 'cat $FILE'","disposition":"drop"},
|
|
{"command":"cd /tmp && cat {root}/docs/adr/x.md;echo","disposition":"drop"},
|
|
{"command":"wc -l <docs/adr/x.md","disposition":"drop"},
|
|
{"command":"cat ~/notes/today.md","disposition":"drop"},
|
|
{"command":"cat docs/adr","disposition":"drop"},
|
|
{"command":"ls docs/notes","disposition":"drop"},
|
|
{"command":"cat c:/SECRET/x.md","disposition":"drop"},
|
|
{"command":"cat C:\\SECRET\\x.md","disposition":"drop"},
|
|
{"command":"ls c:/sec*","disposition":"drop"},
|
|
{"command":"cat src/main.rs","disposition":"keep"},
|
|
{"command":"cat docs/adrx.md","disposition":"keep"},
|
|
{"command":"cat docs/adr-notes/x.md","disposition":"keep"},
|
|
{"command":"ls docs","disposition":"keep"},
|
|
{"command":"cat *.md","disposition":"keep"},
|
|
{"command":"git add .","disposition":"keep"},
|
|
{"command":"cargo test -p ai-memory-hooks","disposition":"keep"},
|
|
{"command":"echo 'docs/adr is ignored'x","disposition":"keep"},
|
|
{"command":"cat notes/today.md","disposition":"keep"},
|
|
{"command":"","disposition":"keep"},
|
|
{"command":"cat C:/Public/x.md","disposition":"keep"},
|
|
{"command":"ls C:/Pub*","disposition":"keep"},
|
|
{"payload":{"tool":"shell","args":{"command":["bash","-lc","cat docs/adr/x.md"]}},"disposition":"drop"},
|
|
{"payload":{"tool":"run_command","args":{"cmd":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"bash","args":{"command":7}},"disposition":"keep"},
|
|
{"payload":{"tool":"exec","args":{"command":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"shell_command","args":{"command":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"terminal","args":{"command":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"execute_bash","args":{"command":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"execute_cmd","args":{"command":"cat docs/adr/x.md"}},"disposition":"drop"},
|
|
{"payload":{"tool":"bash","args":{"command":"cat 0001.md","workdir":"docs/adr"}},"disposition":"drop"},
|
|
{"payload":{"tool":"exec","args":{"command":"cat 0001.md","workdir":"{root}/docs/adr"}},"disposition":"drop"},
|
|
{"payload":{"tool":"bash","args":{"command":"cat ../adr/0001.md","workdir":"docs/x"}},"disposition":"drop"},
|
|
{"payload":{"tool":"bash","args":{"command":"cat docs/adr/0001.md","workdir":" "}},"disposition":"drop"},
|
|
{"payload":{"tool":"bash","args":{"command":"cat docs/adr/0001.md","workdir":"sub"}},"disposition":"keep"},
|
|
{"payload":{"tool":"bash","args":{"command":"cat 0001.md","workdir":7}},"disposition":"keep"}
|
|
]
|
|
},
|
|
"protocol": {"accept":{"version":1,"disposition":"drop","policy_state":"active","tool_family":"file","path_count":1,"extraction_state":"extracted"},"reject":{"version":1,"disposition":"drop","policy_state":"active","tool_family":"file","path_count":1,"extraction_state":"extracted","paths":["SENTINEL"]}}
|
|
}
|