From 15891ddc255deac35770c7aa9e33a25d229699e6 Mon Sep 17 00:00:00 2001 From: "CJACK." Date: Sun, 22 Mar 2026 21:24:06 +0800 Subject: [PATCH] Fix quality-gate fixture drift for permissive tool-call policy --- .../expected/toolcalls_allowlist_empty.json | 17 +++++++++++------ .../toolcalls_case_insensitive_canonical.json | 4 ++-- .../expected/toolcalls_loose_normalize.json | 4 ++-- .../toolcalls_namespace_tail_normalize.json | 4 ++-- .../compat/expected/toolcalls_unknown_name.json | 17 +++++++++++------ tests/node/chat-stream.test.js | 9 ++++++--- 6 files changed, 34 insertions(+), 21 deletions(-) diff --git a/tests/compat/expected/toolcalls_allowlist_empty.json b/tests/compat/expected/toolcalls_allowlist_empty.json index 073bd0d..79829e5 100644 --- a/tests/compat/expected/toolcalls_allowlist_empty.json +++ b/tests/compat/expected/toolcalls_allowlist_empty.json @@ -1,8 +1,13 @@ { - "calls": [], + "calls": [ + { + "name": "unknown_tool", + "input": { + "x": 1 + } + } + ], "sawToolCallSyntax": true, - "rejectedByPolicy": true, - "rejectedToolNames": [ - "unknown_tool" - ] -} \ No newline at end of file + "rejectedByPolicy": false, + "rejectedToolNames": [] +} diff --git a/tests/compat/expected/toolcalls_case_insensitive_canonical.json b/tests/compat/expected/toolcalls_case_insensitive_canonical.json index 5bcd9ce..ffb2cec 100644 --- a/tests/compat/expected/toolcalls_case_insensitive_canonical.json +++ b/tests/compat/expected/toolcalls_case_insensitive_canonical.json @@ -1,7 +1,7 @@ { "calls": [ { - "name": "read_file", + "name": "Read_File", "input": { "path": "README.MD" } @@ -10,4 +10,4 @@ "sawToolCallSyntax": true, "rejectedByPolicy": false, "rejectedToolNames": [] -} \ No newline at end of file +} diff --git a/tests/compat/expected/toolcalls_loose_normalize.json b/tests/compat/expected/toolcalls_loose_normalize.json index 5bcd9ce..c969be4 100644 --- a/tests/compat/expected/toolcalls_loose_normalize.json +++ b/tests/compat/expected/toolcalls_loose_normalize.json @@ -1,7 +1,7 @@ { "calls": [ { - "name": "read_file", + "name": "read-file", "input": { "path": "README.MD" } @@ -10,4 +10,4 @@ "sawToolCallSyntax": true, "rejectedByPolicy": false, "rejectedToolNames": [] -} \ No newline at end of file +} diff --git a/tests/compat/expected/toolcalls_namespace_tail_normalize.json b/tests/compat/expected/toolcalls_namespace_tail_normalize.json index 5bcd9ce..7724b56 100644 --- a/tests/compat/expected/toolcalls_namespace_tail_normalize.json +++ b/tests/compat/expected/toolcalls_namespace_tail_normalize.json @@ -1,7 +1,7 @@ { "calls": [ { - "name": "read_file", + "name": "company.fs.read_file", "input": { "path": "README.MD" } @@ -10,4 +10,4 @@ "sawToolCallSyntax": true, "rejectedByPolicy": false, "rejectedToolNames": [] -} \ No newline at end of file +} diff --git a/tests/compat/expected/toolcalls_unknown_name.json b/tests/compat/expected/toolcalls_unknown_name.json index 073bd0d..79829e5 100644 --- a/tests/compat/expected/toolcalls_unknown_name.json +++ b/tests/compat/expected/toolcalls_unknown_name.json @@ -1,8 +1,13 @@ { - "calls": [], + "calls": [ + { + "name": "unknown_tool", + "input": { + "x": 1 + } + } + ], "sawToolCallSyntax": true, - "rejectedByPolicy": true, - "rejectedToolNames": [ - "unknown_tool" - ] -} \ No newline at end of file + "rejectedByPolicy": false, + "rejectedToolNames": [] +} diff --git a/tests/node/chat-stream.test.js b/tests/node/chat-stream.test.js index 88419d2..3e91697 100644 --- a/tests/node/chat-stream.test.js +++ b/tests/node/chat-stream.test.js @@ -58,7 +58,7 @@ test('boolDefaultTrue keeps false only when explicitly false', () => { assert.equal(boolDefaultTrue(undefined), true); }); -test('filterIncrementalToolCallDeltasByAllowed blocks unknown name and follow-up args', () => { +test('filterIncrementalToolCallDeltasByAllowed keeps unknown name and follow-up args', () => { const seen = new Map(); const filtered = filterIncrementalToolCallDeltasByAllowed( [ @@ -68,8 +68,11 @@ test('filterIncrementalToolCallDeltasByAllowed blocks unknown name and follow-up ['read_file'], seen, ); - assert.deepEqual(filtered, []); - assert.equal(seen.get(0), '__blocked__'); + assert.deepEqual(filtered, [ + { index: 0, name: 'not_in_schema' }, + { index: 0, arguments: '{"x":1}' }, + ]); + assert.equal(seen.get(0), 'not_in_schema'); }); test('filterIncrementalToolCallDeltasByAllowed keeps allowed name and args', () => {