From 9980cfaa616bf1273b754c7c281a2cdfeceae600 Mon Sep 17 00:00:00 2001 From: Jothi Mani Rajendran <250249270+jothimani-rajendran@users.noreply.github.com> Date: Sat, 17 Oct 2026 23:30:30 +0000 Subject: [PATCH] feat(vendors): Copilot CLI witness on vscode_copilot's loads_claude_plugins (CC-2b) vscode_copilot's loads_claude_plugins row gains `witnessed` for the Copilot CLI surface only: GitHub Copilot CLI 1.0.98 on Windows 11, 2026-10-17, plugin installed with `copilot plugin install ` (local path, which Copilot warns is deprecated); guard (shell) and gate (file write) refused by preToolUse deny (org-plan witness/results/witness-copilot-cli-claude-plugin-2026-10-17.md at 6516f57). Its notes now read the Copilot CLI nested-deny "unknown" as settled for those two cases; VS Code Copilot stays as recorded. The witness test now covers every witnessed agent, not grok alone; the vendor JSON is regenerated with tools/recount_vendor_config.py --write. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017kgeWgju5ysB7LVpEcD9cF Signed-off-by: Jothi Mani Rajendran <250249270+jothimani-rajendran@users.noreply.github.com> --- src/agentseam/data/vendors/grok.json | 2 +- .../data/vendors/vscode_copilot.json | 7 +-- tests/test_claude_plugins.py | 46 +++++++++++++++---- tools/recount/claude_plugins.json | 5 +- tools/recount/sourced.py | 5 +- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/agentseam/data/vendors/grok.json b/src/agentseam/data/vendors/grok.json index 95a6ec2..9c106f6 100644 --- a/src/agentseam/data/vendors/grok.json +++ b/src/agentseam/data/vendors/grok.json @@ -79,7 +79,7 @@ "loads_claude_plugins": { "basis": "vendor-source", "date": "2026-10-17", - "test": "tests/test_claude_plugins.py::test_grok_carries_the_witness_and_no_other_agent_does" + "test": "tests/test_claude_plugins.py::test_only_the_witnessed_agents_carry_a_witness" }, "tools": { "basis": "vendor-docs", diff --git a/src/agentseam/data/vendors/vscode_copilot.json b/src/agentseam/data/vendors/vscode_copilot.json index fddc78c..7704729 100644 --- a/src/agentseam/data/vendors/vscode_copilot.json +++ b/src/agentseam/data/vendors/vscode_copilot.json @@ -67,7 +67,7 @@ "loads_claude_plugins": { "basis": "vendor-source", "date": "2026-10-17", - "test": "tests/test_claude_plugins.py::test_each_entry_records_the_discovery_row" + "test": "tests/test_claude_plugins.py::test_only_the_witnessed_agents_carry_a_witness" }, "tools": { "basis": "vendor-docs", @@ -148,9 +148,10 @@ "hooks": "yes", "how": "Claude-format plugin by manifest location, from a marketplace (.claude-plugin/marketplace.json, anthropics/claude-code accepted) or chat.pluginLocations; needs chat.plugins.enabled", "loads": "yes", - "notes": "VS Code: the Local harness ignores matchers, so every nested command for the event runs; HSO deny and exit 2 block. Copilot CLI (chock's copilot client builds for this entry): loads yes via copilot plugin install or --plugin-dir, legacy manifest includes .claude-plugin/plugin.json, copilot plugin marketplace add anthropics/claude-code; hooks yes (hooks.json or hooks/hooks.json); payload Claude Code for PascalCase events (Claude tool names, e.g. Bash), Copilot camelCase otherwise; deny partial: exit 2 denies, flat permissionDecision documented, nested hookSpecificOutput unknown (closed source)", + "notes": "VS Code: the Local harness ignores matchers, so every nested command for the event runs; HSO deny and exit 2 block. Copilot CLI (chock's copilot client builds for this entry): loads yes via copilot plugin install or --plugin-dir, legacy manifest includes .claude-plugin/plugin.json, copilot plugin marketplace add anthropics/claude-code; hooks yes (hooks.json or hooks/hooks.json); payload Claude Code for PascalCase events (Claude tool names, e.g. Bash), Copilot camelCase otherwise; deny partial: exit 2 denies, flat permissionDecision documented, nested hookSpecificOutput unknown from the docs (closed source), settled by the Copilot CLI 1.0.98 witness for a shell command and a file write (see witnessed)", "payload": "Claude-shaped snake_case, but VS Code's own Local tool names", - "source": "microsoft/vscode-docs@ef0ca127 docs/agents/reference/agent-plugin-reference.md; Copilot CLI: github/docs@dae83f7d content/copilot/reference/copilot-cli-reference/cli-plugin-reference.md (org-plan discovery/2026-10-17-claude-plugin-compat.md)" + "source": "microsoft/vscode-docs@ef0ca127 docs/agents/reference/agent-plugin-reference.md; Copilot CLI: github/docs@dae83f7d content/copilot/reference/copilot-cli-reference/cli-plugin-reference.md (org-plan discovery/2026-10-17-claude-plugin-compat.md)", + "witnessed": "Copilot CLI only, not VS Code: guard (shell command) and gate (file write) refused by preToolUse deny; GitHub Copilot CLI 1.0.98 on Windows 11, 2026-10-17; plugin installed by copilot plugin install (a local path, which Copilot warns is deprecated) (org-plan witness/results/witness-copilot-cli-claude-plugin-2026-10-17.md at 6516f57)" }, "needs_trust": false, "tools": { diff --git a/tests/test_claude_plugins.py b/tests/test_claude_plugins.py index e39a5a5..4a797db 100644 --- a/tests/test_claude_plugins.py +++ b/tests/test_claude_plugins.py @@ -14,7 +14,31 @@ from agentseam.vendor_config import SCHEMA, VENDOR_CONFIG, loads_claude_plugins # noqa: E402 FIELD = "loads_claude_plugins" -WITNESS_FILE = "witness/results/witness-grok-claude-plugin-2026-10-17.md" +#: agent -> what its witness note must name: the run, the result file and the org-plan commit. +WITNESSES = { + "grok": ( + "guard", + "gate", + "refus", + "Grok Build 1.0.62", + "2026-10-17", + "witness/results/witness-grok-claude-plugin-2026-10-17.md", + "25b9d9d", + ), + "vscode_copilot": ( + "Copilot CLI only, not VS Code", + "guard", + "gate", + "refused by preToolUse deny", + "Copilot CLI 1.0.98", + "Windows 11", + "2026-10-17", + "copilot plugin install ", + "deprecated", + "witness/results/witness-copilot-cli-claude-plugin-2026-10-17.md", + "6516f57", + ), +} #: (loads, hooks, deny_reply) per agent, as org-plan discovery/2026-10-17-claude-plugin-compat.md records them. DISCOVERY_ROWS = { @@ -49,15 +73,16 @@ def test_each_entry_records_the_discovery_row(): assert record["date"] == "2026-10-17", agent -def test_grok_carries_the_witness_and_no_other_agent_does(): +def test_only_the_witnessed_agents_carry_a_witness(): witnessed = {agent for agent, entry in VENDOR_CONFIG.items() if "witnessed" in entry[FIELD]} - assert witnessed == {"grok"} - note = VENDOR_CONFIG["grok"][FIELD]["witnessed"] - for needle in ("guard", "gate", "refus", "Grok Build 1.0.62", "2026-10-17", WITNESS_FILE, "25b9d9d"): - assert needle in note, needle - record = VENDOR_CONFIG["grok"]["evidence"][FIELD] - assert record["basis"] == "vendor-source" - assert record["test"].endswith("::test_grok_carries_the_witness_and_no_other_agent_does") + assert witnessed == set(WITNESSES) + for agent, needles in WITNESSES.items(): + note = VENDOR_CONFIG[agent][FIELD]["witnessed"] + for needle in needles: + assert needle in note, (agent, needle) + record = VENDOR_CONFIG[agent]["evidence"][FIELD] + assert record["basis"] == "vendor-source", agent + assert record["test"].endswith("::test_only_the_witnessed_agents_carry_a_witness"), agent def test_a_no_or_unknown_load_never_reports_a_hook_or_deny_verdict(): @@ -74,7 +99,8 @@ def test_vscode_copilot_also_records_the_copilot_cli_row(): "Copilot CLI", "copilot plugin install", ".claude-plugin/plugin.json", - "nested hookSpecificOutput unknown", + "nested hookSpecificOutput unknown from the docs", + "settled by the Copilot CLI 1.0.98 witness for a shell command and a file write", ): assert needle in row["notes"], needle assert "github/docs@dae83f7d" in row["source"] diff --git a/tools/recount/claude_plugins.json b/tools/recount/claude_plugins.json index d467dd1..1b86a31 100644 --- a/tools/recount/claude_plugins.json +++ b/tools/recount/claude_plugins.json @@ -186,9 +186,10 @@ "hooks": "yes", "how": "Claude-format plugin by manifest location, from a marketplace (.claude-plugin/marketplace.json, anthropics/claude-code accepted) or chat.pluginLocations; needs chat.plugins.enabled", "loads": "yes", - "notes": "VS Code: the Local harness ignores matchers, so every nested command for the event runs; HSO deny and exit 2 block. Copilot CLI (chock's copilot client builds for this entry): loads yes via copilot plugin install or --plugin-dir, legacy manifest includes .claude-plugin/plugin.json, copilot plugin marketplace add anthropics/claude-code; hooks yes (hooks.json or hooks/hooks.json); payload Claude Code for PascalCase events (Claude tool names, e.g. Bash), Copilot camelCase otherwise; deny partial: exit 2 denies, flat permissionDecision documented, nested hookSpecificOutput unknown (closed source)", + "notes": "VS Code: the Local harness ignores matchers, so every nested command for the event runs; HSO deny and exit 2 block. Copilot CLI (chock's copilot client builds for this entry): loads yes via copilot plugin install or --plugin-dir, legacy manifest includes .claude-plugin/plugin.json, copilot plugin marketplace add anthropics/claude-code; hooks yes (hooks.json or hooks/hooks.json); payload Claude Code for PascalCase events (Claude tool names, e.g. Bash), Copilot camelCase otherwise; deny partial: exit 2 denies, flat permissionDecision documented, nested hookSpecificOutput unknown from the docs (closed source), settled by the Copilot CLI 1.0.98 witness for a shell command and a file write (see witnessed)", "payload": "Claude-shaped snake_case, but VS Code's own Local tool names", - "source": "microsoft/vscode-docs@ef0ca127 docs/agents/reference/agent-plugin-reference.md; Copilot CLI: github/docs@dae83f7d content/copilot/reference/copilot-cli-reference/cli-plugin-reference.md (org-plan discovery/2026-10-17-claude-plugin-compat.md)" + "source": "microsoft/vscode-docs@ef0ca127 docs/agents/reference/agent-plugin-reference.md; Copilot CLI: github/docs@dae83f7d content/copilot/reference/copilot-cli-reference/cli-plugin-reference.md (org-plan discovery/2026-10-17-claude-plugin-compat.md)", + "witnessed": "Copilot CLI only, not VS Code: guard (shell command) and gate (file write) refused by preToolUse deny; GitHub Copilot CLI 1.0.98 on Windows 11, 2026-10-17; plugin installed by copilot plugin install (a local path, which Copilot warns is deprecated) (org-plan witness/results/witness-copilot-cli-claude-plugin-2026-10-17.md at 6516f57)" } }, "windsurf": { diff --git a/tools/recount/sourced.py b/tools/recount/sourced.py index 7dceece..96116b6 100644 --- a/tools/recount/sourced.py +++ b/tools/recount/sourced.py @@ -26,12 +26,13 @@ #: Whether each agent loads a Claude Code plugin, transcribed from org-plan #: discovery/2026-10-17-claude-plugin-compat.md (CC-1, read 2026-10-17); unknown and partial -#: rows stay so. Grok alone adds the owner's witness run (witness/results at org-plan 25b9d9d). +#: rows stay so. Grok (org-plan 25b9d9d) and vscode_copilot's Copilot CLI (org-plan 6516f57) add +#: the owner's witness runs, from witness/results. with open(os.path.join(os.path.dirname(__file__), "claude_plugins.json"), encoding="utf-8") as _fh: LOADS_CLAUDE_PLUGINS = json.load(_fh) _CLAUDE_PLUGINS_READ = "2026-10-17" _CLAUDE_PLUGINS_TEST = "tests/test_claude_plugins.py::test_each_entry_records_the_discovery_row" -_CLAUDE_PLUGINS_WITNESS_TEST = "tests/test_claude_plugins.py::test_grok_carries_the_witness_and_no_other_agent_does" +_CLAUDE_PLUGINS_WITNESS_TEST = "tests/test_claude_plugins.py::test_only_the_witnessed_agents_carry_a_witness" #: Repo hook configs this agent read before its current `config_path`, and still reads as a #: fallback. windsurf: docs.devin.ai/desktop/cascade/hooks (read 2026-10-13), Workspace-Level --