Skip to content

Order the LF Conversion Before Carrying Files Into a CRLF-Default Repository - #2322

Merged
ptr727 merged 8 commits into
developfrom
feature/lf-conversion-order
Oct 4, 2026
Merged

ptr727 merged 8 commits into
developfrom
feature/lf-conversion-order

Conversation

@ptr727

@ptr727 ptr727 commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Summary

Settles #2290 in one change, covering every constraint recorded on the issue.

  • Convert first. A repository still on the old CRLF default lands its line-ending conversion before anything else is carried, as its own merged pull request, which carries its own .editorconfig and .gitattributes. This step is added to:

    • RESYNC.md section 3 and STANDUP.md section 1A
    • the resync-a-repo and standup-a-repo skills, which restate the apply order themselves.

    Each of these points at the one trigger in docs/eol-lf-rollout.md. Once the conversion merges, the remaining work is based on develop, and a resync re-measures.

  • docs/eol-lf-rollout.md "Per-Repo Conversion" is now an ordered procedure:

    • The trigger is read on the base branch: a missing config file, a missing LF default, or an unpinned i/crlf file in the index.
    • Merge, not overwrite. Both config files take the hub's defaults merged in, keeping the repository's own attributes and sections.
    • Vendor pins go in before renormalizing, as a .gitattributes and .editorconfig pair, with globs for both letter cases.
    • Renormalize in its own commit, verified with the staged diff. Only --renormalize or a first add normalizes a file.
    • A fresh detached worktree comes before editorconfig-checker, since --renormalize changes only the index.
    • Isolation. The pull request holds only the renormalization and its two config files, so a squash-only develop keeps it isolated.
  • The rest of the rollout doc:

    • "What Changed" no longer describes the old * -text file, and it credits the .gitattributes default to its later pull request.
    • A hub pull request ticks a box once the conversion reaches main.
    • The checklist is updated from main as read on 2026-10-03. Each repository's .editorconfig and .gitattributes were read, and its committed bytes were scanned for CRLF text outside a -text pin. EspDinIoT, DevKitCIoT, AudioCleaner and HolidayLights stay unchecked, each with what it still lacks.
  • references/line-endings.md. The byte-preserve recipe now sets insert_final_newline = unset, because under false editorconfig-checker reports "no final newline expected" for every file that ends in a newline (tested). The reference and the .gitattributes comment now say text=auto byte-preserves only what Git detects as binary, and that normalization happens on a first add or a renormalize.

Fixes #2290

Verification

  • The prose gate is clean apart from the edited .gitattributes comment lines, which need the comments label.
  • The repo gate, spec/validate.py, build_dist.py --check, and markdownlint are clean.
  • A local strict review ran three rounds. The ten findings it raised are fixed in ba8d1afd and fd92f434, and the final round found nothing.

🤖 Generated with Claude Code

ptr727 and others added 3 commits October 3, 2026 16:52
…ository

RESYNC.md section 3, STANDUP.md section 1A, and the resync-a-repo and
standup-a-repo skills now land a line-ending conversion first, as its own
pull request, for a repository docs/eol-lf-rollout.md says needs one. That
pull request carries its own .editorconfig and .gitattributes ahead of the
instruction set.

docs/eol-lf-rollout.md states the trigger once and rewrites "Per-Repo
Conversion" as an ordered procedure:
- merge the hub's defaults into both config files rather than overwriting them
- pin text-shaped vendor files as a .gitattributes and .editorconfig pair,
  with both-case globs, before renormalizing
- name what normalizes
- keep the pull request to the renormalization and its two config files, so a
  squash-only develop leaves it isolated.
"What Changed" no longer describes the old * -text file. The tick rule says a
hub pull request checks a box after the conversion merges, and the checklist is
updated from each repository's default branch as read on 2026-10-03.

The byte-preserve recipe in references/line-endings.md sets
insert_final_newline = unset rather than false, since editorconfig-checker
refuses a final newline under false. It and the .gitattributes comment now say
text=auto byte-preserves only what Git detects as binary.

Fixes #2290

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…verted

The conversion trigger now reads both config files on main and develop and
lists an unpinned CRLF file in the index, since a carried .gitattributes alone
leaves committed CRLF blobs in place. The verification step reads the staged
diff, a fresh checkout precedes editorconfig-checker because --renormalize
changes only the index, and What Changed credits the later .gitattributes
change. RESYNC.md, STANDUP.md, and both skills base the remaining work on
develop once the conversion merges, and the line-endings reference and the
.gitattributes comment say normalization happens on a first add or a
renormalize, not on a plain re-add.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The trigger reads the branch work is based on, develop where a repo keeps one,
so a conversion merged there releases the resync and standup gate, and the box
is ticked once the conversion reaches main. The fresh checkout is a detached
worktree, since the branch is already checked out, and the staged-stat check
covers only the -text and binary pins, since a CRLF-pinned file is
renormalized too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings October 4, 2026 00:05
@ptr727 ptr727 added the comments Permits the comment lines the pull request adds or edits, which the prose gate otherwise refuses label Oct 4, 2026
@coderabbitai

coderabbitai Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: ptr727/ProjectTemplate/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3b937f30-404c-49f6-92ee-25823dd4d133
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Oct 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (develop@8b38010). Learn more about missing BASE report.

Additional details and impacted files
@@            Coverage Diff             @@
##             develop    #2322   +/-   ##
==========================================
  Coverage           ?   58.22%           
==========================================
  Files              ?       16           
  Lines              ?     7821           
  Branches           ?        0           
==========================================
  Hits               ?     4554           
  Misses             ?     3267           
  Partials           ?        0           
Flag Coverage Δ
python-3.13 58.22% <ø> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Unresolved workflow and rollout-documentation issues affect conversion-branch isolation, staging safety, configuration precedence, and empty-repository handling.

Review effort: Lite
Findings: 2 Low severity

Open (2)
What changed in this PR

Updates fleet procedures so CRLF-default repositories convert to LF before receiving carried files.

Changes:

  • Adds conversion prerequisites to standup and resync workflows.
  • Documents config merging, vendor pins, renormalization, and verification.
  • Updates line-ending guidance, generated skills, and source digests.
File Reviewed change
STANDUP.md Adds conversion prerequisite.
RESYNC.md Orders conversion before resync.
docs/​eol-lf-rollout.md Defines conversion procedure and checklist.
.github/​skills/​standup-a-repo/​SKILL.md Mirrors standup guidance.
.github/​skills/​resync-a-repo/​SKILL.md Mirrors resync guidance.
.github/​skills/​comment-and-doc-style/​references/​line-endings.md Updates EOL guidance.
.gitattributes Clarifies normalization behavior.
.claude-plugin/​fleet-skills/​skills/​standup-a-repo/​SKILL.md Updates generated standup skill.
.claude-plugin/​fleet-skills/​skills/​resync-a-repo/​SKILL.md Updates generated resync skill.
.claude-plugin/​fleet-skills/​skills/​comment-and-doc-style/​references/​line-endings.md Updates generated EOL guidance.
.claude-plugin/​fleet-skills/​.source-digests/​standup-a-repo Updates source digest.
.claude-plugin/​fleet-skills/​.source-digests/​resync-a-repo Updates source digest.
.claude-plugin/​fleet-skills/​.source-digests/​comment-and-doc-style Updates source digest.
.agents/​skills/​standup-a-repo/​SKILL.md Updates canonical standup skill.
.agents/​skills/​resync-a-repo/​SKILL.md Updates canonical resync skill.
.agents/​skills/​comment-and-doc-style/​references/​line-endings.md Updates canonical EOL guidance.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread docs/eol-lf-rollout.md Outdated
Comment thread docs/eol-lf-rollout.md Outdated
ptr727 and others added 3 commits October 3, 2026 18:14
A surviving * -text, as the last matching line, leaves --renormalize with
nothing to do, so step 1 replaces both old fleet defaults. The squash note now
says the commit boundaries are for review before merge, with the pull
request's file scope as the isolation that survives the squash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A later match overrides a property an earlier one set in both files, so step 1
now orders the hub defaults first, then the CRLF pins, the repository's own
attributes and the vendor pins, and states the override per property rather
than per line. The staged-stat check covers every -text or binary pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 1 kept every path pin, which would keep the old fleet's redundant *.sh,
uv.lock, Dockerfile, and by-path LF pins that What Changed and the
line-endings reference say are dropped. It now removes them and keeps only
the repository's own path pins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

Unresolved configuration-exception, branch-verification, and rollout-checklist issues remain.

Review effort: Lite
Findings: None

Resolved since last review (2)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Handle missing CRLF configuration in the operational exception

docs/​eol-lf-rollout.md:39

[P1] Handle missing config in the CRLF operational exception. The trigger above treats a missing .editorconfig or .gitattributes as requiring work, but this exception then skips the conversion and gives no alternative procedure. That leaves a lineEndings: crlf operational repo without the required config pair, contrary to the line-endings policy's requirement that both files exist and carry the app's CRLF defaults. Add a separate CRLF-config setup path or narrow the exception to repos whose pair is already present.

ptr727 and others added 2 commits October 3, 2026 18:29
The trigger treats a missing .editorconfig or .gitattributes as needing the
conversion, which the operational CRLF exception then skips. It now says such
a repo still carries both files, set up per the line-endings reference's
operational section rather than through this procedure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The LF overrides for scripts a CRLF operational repo runs on POSIX live in the
line-endings reference's scripts section, not its operational one, so the
sentence cites both and sits after the paragraph's Vantage-Config note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ptr727

ptr727 commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Answering Copilot's review-body finding "[P1] Handle missing config in the CRLF operational exception" (docs/eol-lf-rollout.md:39): fixed in 6e704f6 and 45c513f. The operational lineEndings: crlf exception now says such a repo still carries both files, with the CRLF defaults from references/line-endings.md "Operational (config) repos" and the LF overrides from its "Scripts and extensionless executables" for scripts it runs on POSIX. A missing file is added that way rather than through the conversion procedure.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Unresolved conversion-trigger, exception-handling, and checklist findings remain, including one critical issue.

Review effort: Lite
Findings: 1 High severity

Open (1)

Comment thread docs/eol-lf-rollout.md
@ptr727
ptr727 merged commit 848498a into develop Oct 4, 2026
11 checks passed
@ptr727
ptr727 deleted the feature/lf-conversion-order branch October 4, 2026 02:29
ptr727 added a commit that referenced this pull request Oct 4, 2026
…tions, and a Guard Wait Bound (#2326)

## Summary

Promotes `develop` to `main` with three pull requests, each already
reviewed and merged into `develop`:

- [#2117](#2117) denies a
signal-0 `timeout` as a wait bound in the `gh-write-guard` hook. It
comes from the unattended `auto-1634` lane.
- [#2322](#2322) orders
the LF conversion before carrying files into a CRLF-default repository:
- in `RESYNC.md`, `STANDUP.md`, and the `resync-a-repo` and
`standup-a-repo` skills
- as an ordered "Per-Repo Conversion" procedure in
`docs/eol-lf-rollout.md`
- with a corrected byte-preserve recipe in the line-endings reference
(`insert_final_newline = unset`).
- [#2324](#2324) records
KiCadLibrary's hub workflow adoptions now that its `main` carries them,
and deletes the stale registry driftNote.

Closes #2290
Closes #1634

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comments Permits the comment lines the pull request adds or edits, which the prose gate otherwise refuses

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants