clean-commit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited clean-commit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Commit messages describe the change, not the author's tooling. Never add AI/tool attribution to a commit message unless the user explicitly asks for it in the current turn.
Before finalizing any commit message (subject + body + trailers), the message MUST NOT contain any of the following. Match case-insensitively.
Any Co-Authored-By: line pointing to an AI assistant or bot account.
Examples to remove:
Co-Authored-By: Claude <[email protected]>Co-Authored-By: ChatGPT <...>Co-Authored-By: Cursor Agent <...>Co-Authored-By: GitHub Copilot <...>Co-Authored-By: Codex <...>Co-Authored-By: Gemini <...>Co-Authored-By: whose name or email references an AI product, assistant, bot, or noreply address of an AI vendor.Real human Co-Authored-By: trailers are allowed and encouraged when appropriate.
Any line that advertises the tool used to author the commit.
Examples to remove:
Generated with [Claude Code](https://...)Generated with Claude CodeGenerated by CursorGenerated by GitHub CopilotWritten by ChatGPTAuthored via <AI tool>Made with <AI tool>via Cursor, via Claude, via ChatGPT, via Copilothttps://claude.com/claude-code, https://cursor.com, https://openai.com/...) when used as an attribution link.Emoji commonly used by AI tooling to mark generated output.
Examples to remove when they appear as a signature or prefix/suffix of a generator footer:
🤖, 🤖 Generated ...🧠 Generated ...✨ Generated with ...Normal content emoji inside a human-written message (e.g. :sparkles: in a gitmoji-style project) is fine.
Do not name the model or the AI product as the author.
Examples to remove:
Claude, Claude 3.5 Sonnet, Claude Opus, Claude Haiku, Claude CodeGPT, GPT-4, GPT-4o, GPT-5, o1, o3, o4Gemini, Gemini 2.5 ProCopilot, GitHub CopilotCursor, Cursor Agent, Cursor TabCodex, Devin, Aider, OpenCodeThese names are only forbidden as authorship/attribution. If the change itself is about integrating such a product (e.g. feat: add Copilot webhook handler), the name is allowed as subject matter.
Examples to remove:
As an AI, ...As a language model, ...I generated ...I wrote this commit ...by AI, AI-generated<!-- generated by ... -->?utm_source=claude-code).[NF], [PR], JIRA-123:, scopes, issue references, Fixes #123, Refs: ....Co-Authored-By: trailers.Signed-off-by: trailers for the human committer.Before running git commit, git commit --amend, or proposing a message to the user:
When the agent itself invokes git commit -m "..." or uses a heredoc, the same scan applies to the exact string being passed.
Some IDEs or agent CLIs append their own trailer to commits after the message leaves the agent, by injecting flags like --trailer "Made-with: Cursor" into git commit. The resulting line appears in the committed message but was never part of the string the agent wrote, so the pre-commit self-check above cannot see it.
Detection:
git log -1 --format=%B and scan that output against the same forbidden list.Made-with: Cursor, X-Cursor: ..., vendor-specific X-<Tool>: ... lines.When an out-of-band trailer is observed:
~/.cursor/cli-config.json with commitAttribution: false and prAttribution: false. Do not apply it silently.git commit --amend with the cleaned message after the injection source is disabled. If it has been pushed, follow the "Amending existing history" rules below — do not rewrite pushed history without explicit confirmation.Do not rewrite or force-push existing commits just to strip AI attribution from history. History rewrites are destructive and may not be wanted.
Instead:
git rebase -i / git filter-repo can scrub history, but only do it when the user explicitly asks and confirms the force-push implications.The only time AI attribution may appear in a commit message is when the user, in the current turn, explicitly asks for it (e.g. "add a Co-Authored-By Claude trailer"). Even then:
Do not infer consent from silence, from previous commits in the repo, or from a general "use Claude Code" setup.
Bad:
feat(auth): add JWT refresh endpoint
Implements POST /auth/refresh with 15 min access / 7 day refresh tokens.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>Good:
feat(auth): add JWT refresh endpoint
Implements POST /auth/refresh with 15 min access / 7 day refresh tokens.Bad:
fix(reports): correct timezone off-by-one in daily rollup
Generated by Cursor Agent.Good:
fix(reports): correct timezone off-by-one in daily rollup
Convert timestamps to UTC before bucketing so DST transitions no longer
shift a day's rows into the neighbouring bucket.User turn: "Commit this and add Co-Authored-By: Claude."
Acceptable:
refactor(db): extract connection pool into its own module
Co-Authored-By: Claude <[email protected]>Still not acceptable (extra unrequested attribution):
refactor(db): extract connection pool into its own module
🤖 Generated with Claude Code
Co-Authored-By: Claude <[email protected]>~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.