Declare the six extensionless tool configs as text - #954
Conversation
check_character_conformity.py judges only files whose `text` attribute is set in .gitattributes; anything unspecified is skipped and counted as a visible gap (586 tracked files today). The configs #950 adds have no extension, or an extension .gitattributes does not cover, so all six would join that bucket and never be checked for encoding. Declared literally rather than by pattern. `*.xml` was the obvious shortcut and it is wrong here: RSS.xml is committed with CRLF, so a blanket `text eol=lf` would rewrite its line endings as a side effect of declaring a config file. Six named entries cost nothing and touch nothing else. Verified: all six resolve to `text: set, eol: lf` via `git check-attr`; RSS.xml still resolves to `unspecified` on both; no other file in the tree changes. The benefit only materialises once #950 merges, since these files do not exist on main yet. `git check-attr` works on paths regardless of whether they are tracked, which is why it is the verification used here rather than a before/after count. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EBV6TkrwsZhcwkh1b6NUHs
|
Warning Review limit reached
Next review available in: 42 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThis PR updates .gitattributes to explicitly declare six extensionless (or special-case) tool configuration files as text with LF line endings, avoiding broad XML patterns that could inadvertently alter existing XML files like RSS.xml. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Insufficient balance to process this code review. Please add funds or upgrade your plan in billing. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing |
Up to standards ✅🟢 Issues
|
There was a problem hiding this comment.
Pull request overview
Declares six tool configuration files as LF-normalized text for character-conformity checks.
Changes:
- Adds explicit
.gitattributesentries for six configs. - Avoids a broad XML rule that would affect
RSS.xml.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Copilot: the six entries were unanchored basename patterns, so git applied them at any depth. Measured before the fix: some/deep/dir/.pylintrc text: set .codex/skills/ruleset.xml text: set sub/.bandit text: set That directly contradicts this PR's own claim -- "no pattern, so no file outside the named six can be affected." A .gitattributes pattern with no slash is a basename match, exactly like .gitignore. Which is the same trap I documented in #953 one PR earlier, in the other direction. Each entry now carries a leading slash. Verified after: root .bandit/.pylintrc/.remarkrc/.shellcheckrc/.stylelintrc/ruleset.xml text: set (unchanged) some/deep/dir/.pylintrc text: unspecified (was: set) .codex/skills/ruleset.xml text: unspecified (was: set) sub/.bandit text: unspecified (was: set) RSS.xml text: unspecified (unchanged) The comment now explains the anchoring alongside the `*.xml` note, since the two traps have the same root cause: git pattern matching is path-anchored only when the pattern contains a slash. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EBV6TkrwsZhcwkh1b6NUHs
|
Insufficient balance to process this code review. Please add funds or upgrade your plan in billing. |
|
PING! |
The 110-line case-folded LFS + eol ruleset was deleted in ecbe685, leaving zero attributes resolving: LFS orphaned (1,845 pointers, no patterns), no eol authority (system core.autocrlf=true unchecked - the mechanism behind the 2026-08-11 .ollama model-blob corruption). Base = origin/main:.gitattributes adopted verbatim (incl. #954's anchored extensionless-config block) so the eventual logan/obsidian -> main merge stays suffix-only. Vault-local section appends: .ollama byte-exactness guard (-text -diff -merge -filter), LF-anchored repo plumbing, and census binary classes (fonts/ico/pyc/etl/dat/sqlite-wal). Historical raw blobs (440 jpg / 130 png / 52 mp4 / 16 MOV) deliberately NOT converted - no renormalize churn; they migrate individually on next modification. Future adds of all media classes go to LFS automatically.
The 110-line case-folded LFS + eol ruleset was deleted in 7e26d23, leaving zero attributes resolving: LFS orphaned (1,845 pointers, no patterns), no eol authority (system core.autocrlf=true unchecked - the mechanism behind the 2026-08-11 .ollama model-blob corruption). Base = origin/main:.gitattributes adopted verbatim (incl. #954's anchored extensionless-config block) so the eventual logan/obsidian -> main merge stays suffix-only. Vault-local section appends: .ollama byte-exactness guard (-text -diff -merge -filter), LF-anchored repo plumbing, and census binary classes (fonts/ico/pyc/etl/dat/sqlite-wal). Historical raw blobs (440 jpg / 130 png / 52 mp4 / 16 MOV) deliberately NOT converted - no renormalize churn; they migrate individually on next modification. Future adds of all media classes go to LFS automatically.
The 110-line case-folded LFS + eol ruleset was deleted in aff3e54, leaving zero attributes resolving: LFS orphaned (1,845 pointers, no patterns), no eol authority (system core.autocrlf=true unchecked - the mechanism behind the 2026-08-11 .ollama model-blob corruption). Base = origin/main:.gitattributes adopted verbatim (incl. #954's anchored extensionless-config block) so the eventual logan/obsidian -> main merge stays suffix-only. Vault-local section appends: .ollama byte-exactness guard (-text -diff -merge -filter), LF-anchored repo plumbing, and census binary classes (fonts/ico/pyc/etl/dat/sqlite-wal). Historical raw blobs (440 jpg / 130 png / 52 mp4 / 16 MOV) deliberately NOT converted - no renormalize churn; they migrate individually on next modification. Future adds of all media classes go to LFS automatically.
The 110-line case-folded LFS + eol ruleset was deleted in 2658311d6, leaving zero attributes resolving: LFS orphaned (1,845 pointers, no patterns), no eol authority (system core.autocrlf=true unchecked - the mechanism behind the 2026-08-11 .ollama model-blob corruption). Base = origin/main:.gitattributes adopted verbatim (incl. #954's anchored extensionless-config block) so the eventual logan/obsidian -> main merge stays suffix-only. Vault-local section appends: .ollama byte-exactness guard (-text -diff -merge -filter), LF-anchored repo plumbing, and census binary classes (fonts/ico/pyc/etl/dat/sqlite-wal). Historical raw blobs (440 jpg / 130 png / 52 mp4 / 16 MOV) deliberately NOT converted - no renormalize churn; they migrate individually on next modification. Future adds of all media classes go to LFS automatically.
AGENT PR TEMPLATE
Agent: Claude Code (
agent:claude-code)Date: 2026-08-11
Branch:
claude/gitattributes-declare-qzt7le→mainChanges Made
Six root-anchored entries in
.gitattributes, plus a comment.check_character_conformity.pyjudges only files whosetextattribute is set — anything unspecified is skipped and counted as a visible gap (586 tracked files today). The configs #950 adds have no extension, or an extension.gitattributesdoesn't cover, so all six would land in that bucket and never be checked for encoding:/.bandit,/.pylintrc,/.remarkrc,/.shellcheckrc,/.stylelintrc,/ruleset.xmlCorrection: the first version of this PR was broader than it claimed
This body originally said "No pattern, so no file outside the named six can be affected." That was wrong. Copilot caught it. A
.gitattributespattern containing no slash is a basename match applied at any depth — the same rule as.gitignore. Measured before the fix:Each entry now carries a leading slash, which is what actually restricts it to the repo root.
Worth naming the pattern rather than just the bug: this is the identical trap as
!*.mdin #953, which I documented there and then walked into from the other direction here. A git pattern is path-anchored only when it contains a slash — true for.gitignoreand.gitattributesalike.Why literal entries and not
*.xml*.xmlwas the obvious shortcut for the last one, and it is wrong for a different reason.RSS.xmlis committed with CRLF — a blankettext eol=lfwould rewrite its line endings as a side effect of declaring a config file. There are only 6 tracked.xmlfiles outside THE-GEMSTONE, several of them media sidecars (JFAC Panel Full.mp4.xml); none need this and one would be damaged by it.Verified
/.bandit…/ruleset.xml(all six)setset— unchangedsome/deep/dir/.pylintrcsetunspecified.codex/skills/ruleset.xmlsetunspecifiedsub/.banditsetunspecifiedRSS.xmlunspecifiedunspecified— untouchedThe benefit only materialises once #950 merges, since these files don't exist on main yet.
git check-attrresolves attributes for any path whether or not it's tracked, which is why it's the verification here rather than a before/after count of the 586.Related Work
.gitattributeshalf, kept separate because it's a shared surface..gitignorecounterpart, and the source of the same slash-anchoring lesson.Blockers
Checklist:
git check-attr texton all six root paths, three nested paths, andRSS.xml, before and after anchoring; plusgit status --porcelainto confirm nothing else moved.*.xmltrap.Risk Level:
Six root-anchored path declarations, with the nested-match behaviour now measured in both directions rather than asserted.
Labels to apply:
agent:claude-codehttps://claude.ai/code/session_01EBV6TkrwsZhcwkh1b6NUHs