claudetool: strengthen the "no trailers" commit message guidance

Should prevent duplicate trailers.
diff --git a/claudetool/pre-commit.go b/claudetool/pre-commit.go
index d5b5891..eaea6ca 100644
--- a/claudetool/pre-commit.go
+++ b/claudetool/pre-commit.go
@@ -32,7 +32,9 @@
 	cmd.Dir = repoRoot
 	out, err := cmd.CombinedOutput()
 	if err == nil {
-		fmt.Fprintf(buf, "<commit_message_style_examples>%s</commit_message_style_examples>\n\n", out)
+		// Filter out git trailers from examples
+		cleanedExamples := filterGitTrailers(string(out))
+		fmt.Fprintf(buf, "<commit_message_style_examples>%s</commit_message_style_examples>\n\n", cleanedExamples)
 	} else {
 		slog.DebugContext(ctx, "failed to get commit messages", "shas", commitSHAs, "out", string(out), "err", err)
 	}
@@ -68,7 +70,8 @@
 - Special notations or tags
 - Capitalization and punctuation
 
-Ignore Change-ID and Co-authored-by lines in your analysis.
+Do NOT mention in any way Change-ID or Co-authored-by git trailer lines in your analysis, not even their existence.
+Those are added automatically by git hooks; they are NOT part of the commit message style.
 
 First, provide a concise analysis of the predominant patterns.
 Then select up to 3 commit hashes that best exemplify the repository's commit style.
@@ -103,6 +106,20 @@
 	return result, analysis, nil
 }
 
+// filterGitTrailers removes git trailers (Co-authored-by, Change-ID) from commit message examples
+func filterGitTrailers(input string) string {
+	buf := new(strings.Builder)
+	for line := range strings.Lines(input) {
+		lowerLine := strings.ToLower(line)
+		if strings.HasPrefix(lowerLine, "co-authored-by:") || strings.HasPrefix(lowerLine, "change-id:") {
+			continue
+		}
+		buf.WriteString(line)
+	}
+
+	return buf.String()
+}
+
 // isHexString reports whether a string only contains hexadecimal characters
 func isHexString(s string) bool {
 	for _, c := range s {
diff --git a/claudetool/pre-commit_test.go b/claudetool/pre-commit_test.go
new file mode 100644
index 0000000..a8bcb0e
--- /dev/null
+++ b/claudetool/pre-commit_test.go
@@ -0,0 +1,109 @@
+package claudetool
+
+import (
+	"testing"
+)
+
+func TestFilterGitTrailers(t *testing.T) {
+	tests := []struct {
+		name     string
+		input    string
+		expected string
+	}{
+		{
+			name: "filters Co-authored-by",
+			input: `<commit_message_style_example>
+fix: update component
+
+Some description.
+
+Co-authored-by: user@example.com
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+fix: update component
+
+Some description.
+
+</commit_message_style_example>`,
+		},
+		{
+			name: "filters Co-Authored-By",
+			input: `<commit_message_style_example>
+feat: add feature
+
+Co-Authored-By: another@example.com
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+feat: add feature
+
+</commit_message_style_example>`,
+		},
+		{
+			name: "filters Change-ID",
+			input: `<commit_message_style_example>
+docs: update README
+
+Change-ID: I123456789
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+docs: update README
+
+</commit_message_style_example>`,
+		},
+		{
+			name: "filters Change-Id",
+			input: `<commit_message_style_example>
+style: format code
+
+Change-Id: sc987654321
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+style: format code
+
+</commit_message_style_example>`,
+		},
+		{
+			name: "preserves other content",
+			input: `<commit_message_style_example>
+fix: resolve issue
+
+Some detailed explanation.
+With multiple lines.
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+fix: resolve issue
+
+Some detailed explanation.
+With multiple lines.
+</commit_message_style_example>`,
+		},
+		{
+			name: "filters multiple trailers",
+			input: `<commit_message_style_example>
+feat: new feature
+
+Detailed description.
+
+Co-authored-by: user1@example.com
+Co-Authored-By: user2@example.com
+Change-ID: I123
+Change-Id: sc456
+</commit_message_style_example>`,
+			expected: `<commit_message_style_example>
+feat: new feature
+
+Detailed description.
+
+</commit_message_style_example>`,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			result := filterGitTrailers(tt.input)
+			if result != tt.expected {
+				t.Errorf("filterGitTrailers() = %q, want %q", result, tt.expected)
+			}
+		})
+	}
+}