Copilot CLI führt auch die Claude-Hooks aus .claude/settings.json aus – doppelte, falsch zugeordnete Trace-Ereignisse #165

Open
opened 2026-10-01 14:53:23 +00:00 by torben · 0 comments
Owner

Nebenbefund aus #164 (2026-10-01). Die Herleitung stammt aus der Doku. Beobachtet ist es noch nicht, daher status/unconfirmed.

Befund

Copilot CLI liest Hooks nicht nur aus .github/hooks/*.json, sondern auch aus .claude/settings.json und .claude/settings.local.json (Hooks-Referenz: „Cross-tool .claude/settings.json … are also read“). Copilot in VS Code tut das nur mit chat.useClaudeHooks.

Damit gilt unter Copilot CLI auf jeder Plattform:

  • Der Claude-Hook UserPromptSubmit → ./tools/trace-hook --source claude-code --event prompt.submitted läuft zusätzlich zu Copilots eigenem userPromptSubmitted.
  • In die Copilot-Sitzung kommt ein zweites prompt.submitted, mit Quelle claude-code. Die Sitzungs-ID stammt aus der Nutzlast, beide Ereignisse landen also in derselben Sitzung.
  • EVALS.md § Claude Code behandelt den Hook als Claude-Code-eigen. Das stimmt nicht mehr.

Warum es Zinsen trägt: #82 will in .claude/settings.json weitere Ereignisse verdrahten, darunter PreToolUse. Unter Copilot CLI liefen sie mit. Copilots preToolUse ist fail-closed: Ein Exit ungleich 0 verweigert den Tool-Aufruf. Seit #164 endet trace-hook(.ps1) immer mit 0, der Schaden wäre also „nur“ doppelte Ereignisse. Das muss aber geklärt sein, bevor #82 gebaut wird.

Zuerst klären

  • Auf einer echten Copilot-CLI-Sitzung (Linux genügt): Steht im Trace pro Prompt ein prompt.submitted doppelt, und mit welcher Quelle? Das bestätigt den Befund oder widerlegt ihn.
  • Woran erkennt ein Hook, welche Harness ihn startet? Kandidaten sind Umgebungsvariablen (Claude Code setzt CLAUDE_PROJECT_DIR; ob Copilot sie für Claude-Format-Dateien ebenfalls setzt, ist offen) oder die Form der Nutzlast. Das wird gegen die Clients geprüft, nicht geraten.
  • Gibt es in Copilot CLI eine Einstellung, die .claude/settings.json nicht liest? Wenn ja: Ist es zumutbar, sie einer Instanz vorzuschreiben?

Akzeptanzkriterien

  • Unter Copilot CLI erzeugt ein Prompt genau ein prompt.submitted, und als Quelle steht copilot-cli.
  • Unter Claude Code bleibt der Trace unverändert.
  • EVALS.md beschreibt, welche Harness welche Hook-Datei liest.
  • #82 nennt die Lösung als Voraussetzung, bevor dort PreToolUse dazukommt.

Version

Voraussichtlich --patch. Das hängt vom gewählten Weg ab.

Nebenbefund aus #164 (2026-10-01). Die Herleitung stammt aus der Doku. Beobachtet ist es noch nicht, daher `status/unconfirmed`. ## Befund Copilot CLI liest Hooks nicht nur aus `.github/hooks/*.json`, sondern auch aus `.claude/settings.json` und `.claude/settings.local.json` ([Hooks-Referenz](https://docs.github.com/en/copilot/reference/hooks-reference): „Cross-tool .claude/settings.json … are also read“). Copilot in VS Code tut das nur mit `chat.useClaudeHooks`. Damit gilt unter Copilot CLI auf **jeder** Plattform: - Der Claude-Hook `UserPromptSubmit` → `./tools/trace-hook --source claude-code --event prompt.submitted` läuft zusätzlich zu Copilots eigenem `userPromptSubmitted`. - In die Copilot-Sitzung kommt ein zweites `prompt.submitted`, mit Quelle `claude-code`. Die Sitzungs-ID stammt aus der Nutzlast, beide Ereignisse landen also in derselben Sitzung. - EVALS.md § Claude Code behandelt den Hook als Claude-Code-eigen. Das stimmt nicht mehr. **Warum es Zinsen trägt:** #82 will in `.claude/settings.json` weitere Ereignisse verdrahten, darunter `PreToolUse`. Unter Copilot CLI liefen sie mit. Copilots `preToolUse` ist fail-closed: Ein Exit ungleich 0 verweigert den Tool-Aufruf. Seit #164 endet `trace-hook(.ps1)` immer mit 0, der Schaden wäre also „nur“ doppelte Ereignisse. Das muss aber geklärt sein, bevor #82 gebaut wird. ## Zuerst klären - Auf einer echten Copilot-CLI-Sitzung (Linux genügt): Steht im Trace pro Prompt ein `prompt.submitted` doppelt, und mit welcher Quelle? Das bestätigt den Befund oder widerlegt ihn. - Woran erkennt ein Hook, welche Harness ihn startet? Kandidaten sind Umgebungsvariablen (Claude Code setzt `CLAUDE_PROJECT_DIR`; ob Copilot sie für Claude-Format-Dateien ebenfalls setzt, ist offen) oder die Form der Nutzlast. Das wird gegen die Clients geprüft, nicht geraten. - Gibt es in Copilot CLI eine Einstellung, die `.claude/settings.json` nicht liest? Wenn ja: Ist es zumutbar, sie einer Instanz vorzuschreiben? ## Akzeptanzkriterien - [ ] Unter Copilot CLI erzeugt ein Prompt genau ein `prompt.submitted`, und als Quelle steht `copilot-cli`. - [ ] Unter Claude Code bleibt der Trace unverändert. - [ ] EVALS.md beschreibt, welche Harness welche Hook-Datei liest. - [ ] #82 nennt die Lösung als Voraussetzung, bevor dort `PreToolUse` dazukommt. ## Version Voraussichtlich `--patch`. Das hängt vom gewählten Weg ab.
torben added the prio/plannedsize/Sarea/processkind/defectstatus/unconfirmed labels 2026-10-01 14:53:23 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#165