From 017d0dbfab13c3ef31f641936184e70e4ee4c0da Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 26 Aug 2026 08:39:56 -0700 Subject: [PATCH 1/2] Fix Four Real Bugs in Newly-Packaged Skills Per issue #928's 'Real bugs' section (findings surfaced reviewing the skills tree carried into ptr727/Blog for the first time): 1. comment-and-doc-style/references/line-endings.md: the byte-preserve directory example used [/*], which only matches one path component under EditorConfig. A nested file under the directory kept inherited normalization instead of the intended byte-preserve treatment. Now [/**]. 2. operational-vs-release-workflow/references/branch-protection-and- promotion.md: the stage-comparison example diffed git show :2:f / :3:f against a literal file named f rather than the the preceding command selects. Now :2: / :3:. 3. resync-a-repo/SKILL.md and standup-a-repo/SKILL.md: both gave 'repo-config/configure.sh check|apply / release|operational' as inline code with a bare pipe, not a valid mode argument as written. Now show one concrete mode (release) with a note to substitute operational for an operational repo. 4. dotnet-codestyle/references/conventions.md: the GetQuoteOfTheDayAsync example declared async Task with an empty body, which does not compile (CS0161). Given a representative await/return. Regenerated both derived trees via scripts/build_dist.py; --check and scripts/tests/test_build_dist.py both pass. --- .../skills/comment-and-doc-style/references/line-endings.md | 5 +++-- .agents/skills/dotnet-codestyle/references/conventions.md | 6 +++++- .../references/branch-protection-and-promotion.md | 2 +- .agents/skills/resync-a-repo/SKILL.md | 5 +++-- .agents/skills/standup-a-repo/SKILL.md | 5 +++-- .claude-plugin/fleet-skills/.source-digest | 2 +- .../skills/comment-and-doc-style/references/line-endings.md | 5 +++-- .../skills/dotnet-codestyle/references/conventions.md | 6 +++++- .../references/branch-protection-and-promotion.md | 2 +- .claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md | 5 +++-- .claude-plugin/fleet-skills/skills/standup-a-repo/SKILL.md | 5 +++-- .../skills/comment-and-doc-style/references/line-endings.md | 5 +++-- .github/skills/dotnet-codestyle/references/conventions.md | 6 +++++- .../references/branch-protection-and-promotion.md | 2 +- .github/skills/resync-a-repo/SKILL.md | 5 +++-- .github/skills/standup-a-repo/SKILL.md | 5 +++-- 16 files changed, 46 insertions(+), 25 deletions(-) diff --git a/.agents/skills/comment-and-doc-style/references/line-endings.md b/.agents/skills/comment-and-doc-style/references/line-endings.md index bdf0846a..8337cbcf 100644 --- a/.agents/skills/comment-and-doc-style/references/line-endings.md +++ b/.agents/skills/comment-and-doc-style/references/line-endings.md @@ -71,9 +71,10 @@ tool-owned format outside `.bat`/`.cmd`, or a byte-preserve data directory whose consumer may depend on), still pair a `.gitattributes` pin with a matching `.editorconfig` override, since the git pin alone is not enough there, `.gitattributes` governs git while the editor follows `.editorconfig`. For a byte-preserve directory, disable all editor normalization, -not just EOL: `[/*]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = +not just EOL: `[/**]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = false`, `trim_trailing_whitespace = false` (`unset` is EditorConfig's spec-defined special value -that removes an inherited property). +that removes an inherited property, and `**` is needed rather than `*` so a nested file under the +directory is covered too, since `*` excludes `/` and only matches one path component). ## Editing discipline diff --git a/.agents/skills/dotnet-codestyle/references/conventions.md b/.agents/skills/dotnet-codestyle/references/conventions.md index 5eb48540..4ee314bb 100644 --- a/.agents/skills/dotnet-codestyle/references/conventions.md +++ b/.agents/skills/dotnet-codestyle/references/conventions.md @@ -122,5 +122,9 @@ parameters, return values, exceptions, and crefs. /// /// Thrown when is not a supported value. /// -public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) {} +public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) +{ + await Task.Delay(0, cancellationToken); + return $"Quote for {category}"; +} ``` diff --git a/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index 597cd5f1..e5dd1eaf 100644 --- a/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2:f | tr -d '\r') <(git show :3:f | tr -d '\r')`), then open that branch into + (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.agents/skills/resync-a-repo/SKILL.md b/.agents/skills/resync-a-repo/SKILL.md index e291fb66..aadee302 100644 --- a/.agents/skills/resync-a-repo/SKILL.md +++ b/.agents/skills/resync-a-repo/SKILL.md @@ -67,8 +67,9 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release|operational` from the hub at `main`, - then `apply` for what it reports, never from a carried copy. + `repo-config/configure.sh check / release` (substitute `operational` for an + operational repo) from the hub at `main`, then `apply` for what it reports, never from a + carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these. Reconcile the registry entry (`status`, `types`, `releaseTrigger`, `workflowModel`, diff --git a/.agents/skills/standup-a-repo/SKILL.md b/.agents/skills/standup-a-repo/SKILL.md index 54c277a5..8269093d 100644 --- a/.agents/skills/standup-a-repo/SKILL.md +++ b/.agents/skills/standup-a-repo/SKILL.md @@ -75,8 +75,9 @@ maintainer can supply what section 0A lists. 8. **Settings, rulesets, and secrets.** STANDUP.md section 4: confirm the remote and the GitHub repository agree before running anything else here, then apply with - `repo-config/configure.sh apply owner/repo release|operational` from the hub at `main` and check with the same - command's `check` subcommand, never from a hand-built or carried copy. + `repo-config/configure.sh apply owner/repo release` (substitute `operational` for an + operational repo) from the hub at `main` and check with the same command's `check` subcommand, + never from a hand-built or carried copy. 9. **Verify with the audit.** STANDUP.md section 5: run `AUDIT.md` end to end. The repo is stood up only when it passes for its type, or its residual deltas are tracked in diff --git a/.claude-plugin/fleet-skills/.source-digest b/.claude-plugin/fleet-skills/.source-digest index 97ea0b63..844ed885 100644 --- a/.claude-plugin/fleet-skills/.source-digest +++ b/.claude-plugin/fleet-skills/.source-digest @@ -1 +1 @@ -b945e66c274cb82a +13ab69d6982afcd4 diff --git a/.claude-plugin/fleet-skills/skills/comment-and-doc-style/references/line-endings.md b/.claude-plugin/fleet-skills/skills/comment-and-doc-style/references/line-endings.md index bdf0846a..8337cbcf 100644 --- a/.claude-plugin/fleet-skills/skills/comment-and-doc-style/references/line-endings.md +++ b/.claude-plugin/fleet-skills/skills/comment-and-doc-style/references/line-endings.md @@ -71,9 +71,10 @@ tool-owned format outside `.bat`/`.cmd`, or a byte-preserve data directory whose consumer may depend on), still pair a `.gitattributes` pin with a matching `.editorconfig` override, since the git pin alone is not enough there, `.gitattributes` governs git while the editor follows `.editorconfig`. For a byte-preserve directory, disable all editor normalization, -not just EOL: `[/*]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = +not just EOL: `[/**]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = false`, `trim_trailing_whitespace = false` (`unset` is EditorConfig's spec-defined special value -that removes an inherited property). +that removes an inherited property, and `**` is needed rather than `*` so a nested file under the +directory is covered too, since `*` excludes `/` and only matches one path component). ## Editing discipline diff --git a/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md b/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md index 5eb48540..4ee314bb 100644 --- a/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md +++ b/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md @@ -122,5 +122,9 @@ parameters, return values, exceptions, and crefs. /// /// Thrown when is not a supported value. /// -public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) {} +public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) +{ + await Task.Delay(0, cancellationToken); + return $"Quote for {category}"; +} ``` diff --git a/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index 597cd5f1..e5dd1eaf 100644 --- a/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2:f | tr -d '\r') <(git show :3:f | tr -d '\r')`), then open that branch into + (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md b/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md index e291fb66..aadee302 100644 --- a/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md +++ b/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md @@ -67,8 +67,9 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release|operational` from the hub at `main`, - then `apply` for what it reports, never from a carried copy. + `repo-config/configure.sh check / release` (substitute `operational` for an + operational repo) from the hub at `main`, then `apply` for what it reports, never from a + carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these. Reconcile the registry entry (`status`, `types`, `releaseTrigger`, `workflowModel`, diff --git a/.claude-plugin/fleet-skills/skills/standup-a-repo/SKILL.md b/.claude-plugin/fleet-skills/skills/standup-a-repo/SKILL.md index 54c277a5..8269093d 100644 --- a/.claude-plugin/fleet-skills/skills/standup-a-repo/SKILL.md +++ b/.claude-plugin/fleet-skills/skills/standup-a-repo/SKILL.md @@ -75,8 +75,9 @@ maintainer can supply what section 0A lists. 8. **Settings, rulesets, and secrets.** STANDUP.md section 4: confirm the remote and the GitHub repository agree before running anything else here, then apply with - `repo-config/configure.sh apply owner/repo release|operational` from the hub at `main` and check with the same - command's `check` subcommand, never from a hand-built or carried copy. + `repo-config/configure.sh apply owner/repo release` (substitute `operational` for an + operational repo) from the hub at `main` and check with the same command's `check` subcommand, + never from a hand-built or carried copy. 9. **Verify with the audit.** STANDUP.md section 5: run `AUDIT.md` end to end. The repo is stood up only when it passes for its type, or its residual deltas are tracked in diff --git a/.github/skills/comment-and-doc-style/references/line-endings.md b/.github/skills/comment-and-doc-style/references/line-endings.md index bdf0846a..8337cbcf 100644 --- a/.github/skills/comment-and-doc-style/references/line-endings.md +++ b/.github/skills/comment-and-doc-style/references/line-endings.md @@ -71,9 +71,10 @@ tool-owned format outside `.bat`/`.cmd`, or a byte-preserve data directory whose consumer may depend on), still pair a `.gitattributes` pin with a matching `.editorconfig` override, since the git pin alone is not enough there, `.gitattributes` governs git while the editor follows `.editorconfig`. For a byte-preserve directory, disable all editor normalization, -not just EOL: `[/*]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = +not just EOL: `[/**]` with `charset = unset`, `end_of_line = unset`, `insert_final_newline = false`, `trim_trailing_whitespace = false` (`unset` is EditorConfig's spec-defined special value -that removes an inherited property). +that removes an inherited property, and `**` is needed rather than `*` so a nested file under the +directory is covered too, since `*` excludes `/` and only matches one path component). ## Editing discipline diff --git a/.github/skills/dotnet-codestyle/references/conventions.md b/.github/skills/dotnet-codestyle/references/conventions.md index 5eb48540..4ee314bb 100644 --- a/.github/skills/dotnet-codestyle/references/conventions.md +++ b/.github/skills/dotnet-codestyle/references/conventions.md @@ -122,5 +122,9 @@ parameters, return values, exceptions, and crefs. /// /// Thrown when is not a supported value. /// -public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) {} +public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) +{ + await Task.Delay(0, cancellationToken); + return $"Quote for {category}"; +} ``` diff --git a/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index 597cd5f1..e5dd1eaf 100644 --- a/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2:f | tr -d '\r') <(git show :3:f | tr -d '\r')`), then open that branch into + (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.github/skills/resync-a-repo/SKILL.md b/.github/skills/resync-a-repo/SKILL.md index e291fb66..aadee302 100644 --- a/.github/skills/resync-a-repo/SKILL.md +++ b/.github/skills/resync-a-repo/SKILL.md @@ -67,8 +67,9 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release|operational` from the hub at `main`, - then `apply` for what it reports, never from a carried copy. + `repo-config/configure.sh check / release` (substitute `operational` for an + operational repo) from the hub at `main`, then `apply` for what it reports, never from a + carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these. Reconcile the registry entry (`status`, `types`, `releaseTrigger`, `workflowModel`, diff --git a/.github/skills/standup-a-repo/SKILL.md b/.github/skills/standup-a-repo/SKILL.md index 54c277a5..8269093d 100644 --- a/.github/skills/standup-a-repo/SKILL.md +++ b/.github/skills/standup-a-repo/SKILL.md @@ -75,8 +75,9 @@ maintainer can supply what section 0A lists. 8. **Settings, rulesets, and secrets.** STANDUP.md section 4: confirm the remote and the GitHub repository agree before running anything else here, then apply with - `repo-config/configure.sh apply owner/repo release|operational` from the hub at `main` and check with the same - command's `check` subcommand, never from a hand-built or carried copy. + `repo-config/configure.sh apply owner/repo release` (substitute `operational` for an + operational repo) from the hub at `main` and check with the same command's `check` subcommand, + never from a hand-built or carried copy. 9. **Verify with the audit.** STANDUP.md section 5: run `AUDIT.md` end to end. The repo is stood up only when it passes for its type, or its residual deltas are tracked in From e4f7e46440b07112885ed07d128bb90a0b3be407 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 26 Aug 2026 09:20:04 -0700 Subject: [PATCH 2/2] Fix Real Bugs Review Found in This PR's Own Fixes Per review on PR #1023 (CodeRabbit + qodo, both independently): 1. My own :2: / :3: fix put an unquoted placeholder inside a git revision-spec inline code span. An unquoted < is shell redirection, so a naive paste of the whole snippet fails or, worse inside a <(...) process substitution, diff can receive two empty streams and return success, falsely authorizing git checkout --theirs. Quoted the whole revision-spec argument ("git show \":2:\""), matching the paste-safe quoting convention STANDUP.md already uses for its own / placeholder. 2. Same class of bug in my own resync-a-repo/SKILL.md fix: the pre-existing unquoted / placeholder was untouched by my release|operational fix, and review correctly flagged it as still broken. Quoted it the same way. 3. My own GetQuoteOfTheDayAsync fix (an await/return body, to make the example compile) left its documented contract unfulfilled: the body never throws for an unsupported category. Added a representative category check that throws, so the example's XML documentation and its body agree. Regenerated both derived trees; --check and scripts/tests/test_build_dist.py both pass. --- .agents/skills/dotnet-codestyle/references/conventions.md | 5 +++++ .../references/branch-protection-and-promotion.md | 2 +- .agents/skills/resync-a-repo/SKILL.md | 2 +- .claude-plugin/fleet-skills/.source-digest | 2 +- .../skills/dotnet-codestyle/references/conventions.md | 5 +++++ .../references/branch-protection-and-promotion.md | 2 +- .claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md | 2 +- .github/skills/dotnet-codestyle/references/conventions.md | 5 +++++ .../references/branch-protection-and-promotion.md | 2 +- .github/skills/resync-a-repo/SKILL.md | 2 +- 10 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.agents/skills/dotnet-codestyle/references/conventions.md b/.agents/skills/dotnet-codestyle/references/conventions.md index 4ee314bb..2421ab73 100644 --- a/.agents/skills/dotnet-codestyle/references/conventions.md +++ b/.agents/skills/dotnet-codestyle/references/conventions.md @@ -124,6 +124,11 @@ parameters, return values, exceptions, and crefs. /// public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) { + if (category is not ("motivational" or "humor")) + { + throw new ArgumentException($"Unsupported category: {category}", nameof(category)); + } + await Task.Delay(0, cancellationToken); return $"Quote for {category}"; } diff --git a/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index e5dd1eaf..6d934c0e 100644 --- a/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.agents/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into + (`diff <(git show ":2:" | tr -d '\r') <(git show ":3:" | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.agents/skills/resync-a-repo/SKILL.md b/.agents/skills/resync-a-repo/SKILL.md index aadee302..18962375 100644 --- a/.agents/skills/resync-a-repo/SKILL.md +++ b/.agents/skills/resync-a-repo/SKILL.md @@ -67,7 +67,7 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release` (substitute `operational` for an + `repo-config/configure.sh check "/" release` (substitute `operational` for an operational repo) from the hub at `main`, then `apply` for what it reports, never from a carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these. diff --git a/.claude-plugin/fleet-skills/.source-digest b/.claude-plugin/fleet-skills/.source-digest index 844ed885..160eee0d 100644 --- a/.claude-plugin/fleet-skills/.source-digest +++ b/.claude-plugin/fleet-skills/.source-digest @@ -1 +1 @@ -13ab69d6982afcd4 +702692e5f8c8f60e diff --git a/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md b/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md index 4ee314bb..2421ab73 100644 --- a/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md +++ b/.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/conventions.md @@ -124,6 +124,11 @@ parameters, return values, exceptions, and crefs. /// public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) { + if (category is not ("motivational" or "humor")) + { + throw new ArgumentException($"Unsupported category: {category}", nameof(category)); + } + await Task.Delay(0, cancellationToken); return $"Quote for {category}"; } diff --git a/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index e5dd1eaf..6d934c0e 100644 --- a/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into + (`diff <(git show ":2:" | tr -d '\r') <(git show ":3:" | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md b/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md index aadee302..18962375 100644 --- a/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md +++ b/.claude-plugin/fleet-skills/skills/resync-a-repo/SKILL.md @@ -67,7 +67,7 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release` (substitute `operational` for an + `repo-config/configure.sh check "/" release` (substitute `operational` for an operational repo) from the hub at `main`, then `apply` for what it reports, never from a carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these. diff --git a/.github/skills/dotnet-codestyle/references/conventions.md b/.github/skills/dotnet-codestyle/references/conventions.md index 4ee314bb..2421ab73 100644 --- a/.github/skills/dotnet-codestyle/references/conventions.md +++ b/.github/skills/dotnet-codestyle/references/conventions.md @@ -124,6 +124,11 @@ parameters, return values, exceptions, and crefs. /// public async Task GetQuoteOfTheDayAsync(string category, CancellationToken cancellationToken) { + if (category is not ("motivational" or "humor")) + { + throw new ArgumentException($"Unsupported category: {category}", nameof(category)); + } + await Task.Delay(0, cancellationToken); return $"Quote for {category}"; } diff --git a/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md b/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md index e5dd1eaf..6d934c0e 100644 --- a/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md +++ b/.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md @@ -35,7 +35,7 @@ Two traps, both learned the hard way: `git checkout -b promote/develop-to-main origin/main && git merge origin/develop`, take `develop`'s side for the EOL-conflicted files (`git checkout --theirs `) **after confirming each is content-identical modulo EOL, or that `develop` is a strict superset** - (`diff <(git show :2: | tr -d '\r') <(git show :3: | tr -d '\r')`), then open that branch into + (`diff <(git show ":2:" | tr -d '\r') <(git show ":3:" | tr -d '\r')`), then open that branch into `main`. Verify no genuine `main`-only content is dropped (build/test where the repo supports it). ## Why both rulesets omit "Require branches to be up to date before merging" diff --git a/.github/skills/resync-a-repo/SKILL.md b/.github/skills/resync-a-repo/SKILL.md index aadee302..18962375 100644 --- a/.github/skills/resync-a-repo/SKILL.md +++ b/.github/skills/resync-a-repo/SKILL.md @@ -67,7 +67,7 @@ Preserve the evidence RESYNC.md section 2 requires, and do not leave the finding 4. **Interface workflows.** Honor the named contract, required jobs, the ruleset-bound check name, the artifact-name handoff, rather than copying bytes. 5. **Settings, rulesets, and secrets.** Run - `repo-config/configure.sh check / release` (substitute `operational` for an + `repo-config/configure.sh check "/" release` (substitute `operational` for an operational repo) from the hub at `main`, then `apply` for what it reports, never from a carried copy. 6. **Intent files last, and by hand,** since nothing mechanical judges these.