Skip to content

Finish the pull_request paths-ignore sweep on the 16 remaining repos #5

Description

@matt-edmondson

Context

Every dotnet.yml skipped CI for pull requests touching only .md files:

pull_request:
  paths-ignore: ["**.md", ".github/ISSUE_TEMPLATE/**", ".github/pull_request_template.md"]

That makes any ruleset requiring Build, Test & Release block such PRs permanently, because the check never reports. It also affects PRs editing DESCRIPTION.md and TAGS.md, which the Terraform workspace derives repository metadata from.

The filter has been removed from the pull_request trigger in 41 repos. The push trigger keeps its own paths-ignore, deliberately, because release gating runs off KtsuBuild's should_release rather than the event type, so a docs-only push to main could otherwise cut a release.

Verified on the pilot: a PR touching README.md now runs Build, Test & Release, where previously it ran nothing.

Remaining

Seven repos are on active feature branches. Sweeping them would commit onto in-progress work:

AppDataStorage, Essentials, GitIntegration, KtsuBuild, PkmnDB, plus the BlastMerge-essentials-di and ImGuiApp-imagegui-support clones.

Nine repos on main carry unpushed commits. The sweep ends in git push, which pushes the whole branch, so it would publish unrelated work:

Abstractions, Common, Ecosystem, FileSystemProvider, ImGuiApp, IntervalAction, PersistenceProvider, SerializationProvider, UniversalSerializer

Two are archived and read-only, so they are out of scope permanently: CrossRepoActions, SyncFileContents.

Acceptance criteria

  • Local work in the affected repos is pushed or set aside
  • The sweep is completed for the 16 non-archived repos
  • Each file retains exactly one paths-ignore, under push

Method

scripts/Remove-PathsIgnore.ps1 in the infrastructure repo does the edit. Commit with [skip ci] in the subject unless a release is wanted, because KtsuBuild cuts a version on any untagged commit to main. VersionType.Skip fires only when there are no commits in range or all commits carry that tag.

Do not rebase. icon.png is stored in Git LFS across this org and rebases fail on the smudge filter. Fetch and reset to origin/main, re-apply, and push.

Activity

  1. matt-edmondson commented on Sep 8, 2026

    @matt-edmondson
    ContributorAuthor

    Triage

    Priority: Medium Effort: Medium

    What needs to be done: Finish removing paths-ignore from the pull_request trigger (keeping it on push) across the 16 remaining non-archived repos, after clearing local work that's currently in the way.

    Suggested next steps / acceptance criteria:

    • Push or set aside in-progress work in the 7 active-feature-branch repos and the 9 with unpushed main commits
    • Run scripts/Remove-PathsIgnore.ps1 (infrastructure repo) across the 16 repos, committing with [skip ci] unless a release is actually wanted
    • Confirm each file retains exactly one paths-ignore, under push only
    • Skip the 2 archived repos permanently

    Blockers / dependencies: Blocks any ruleset (.github#2) requiring the Build, Test & Release check on repos still carrying the old filter — otherwise .md-only PRs (including PRs touching DESCRIPTION.md/TAGS.md) become unmergeable


    Generated by Claude Code

  2. matt-edmondson commented on Sep 22, 2026

    @matt-edmondson
    ContributorAuthor

    Triage

    Still actionable, premise re-verified — and the recorded blocker dissolves if the sweep goes through pull requests instead of pushes. Not assigning myself; the routing question below is yours, not mine.

    Checked this as part of a backlog sweep and it is the only open unassigned issue in the org I found that has not already been triaged out.

    The premise holds

    ktsu-dev/ImGuiApp's .github/workflows/dotnet.yml at f47dba0 still has the filter on both triggers:

    on:
      push:
        branches: [main, develop]
        paths-ignore:
          ["**.md", ".github/ISSUE_TEMPLATE/**", ".github/pull_request_template.md"]
      pull_request:
        paths-ignore:
          ["**.md", ".github/ISSUE_TEMPLATE/**", ".github/pull_request_template.md"]

    So the sweep really is unfinished, four weeks on, and ImGuiApp is on the "unpushed commits on main" list.

    The blocker is about local working copies, not about the repos

    Both stated blockers are properties of your machine, not of the repositories:

    Seven repos are on active feature branches. Sweeping them would commit onto in-progress work.
    Nine repos on main carry unpushed commits. The sweep ends in git push, which pushes the whole branch, so it would publish unrelated work.

    Both follow from the Method — Remove-PathsIgnore.ps1 edits in place and ends in git push from whatever checkout it runs in. A branch cut from a fresh clone of origin/main, carrying one commit that touches one file, cannot commit onto in-progress work and cannot publish unpushed commits, because it has never seen them. The 16 repos become 16 one-file pull requests, and your local checkouts stay untouched.

    Why I stopped rather than doing it

    Three things make this your call rather than a drive-by:

    1. It is a different method from the one the issue specifies. The issue says commit with [skip ci] and push, deliberately, so KtsuBuild does not cut a version. A pull request is a different act with different release and CI consequences, and 16 of them is a visible amount of org-wide traffic.
    2. The list may be stale. It was written 2026-08-27 and names dotnet.yml, while ktsu-dev/.github's own CLAUDE.md now describes repos moving onto ci.yml dispatching to ci-shared.yml. Some of the 16 may have been swept or restructured since. Worth re-deriving the list before acting on it rather than trusting the one in the body — I verified only ImGuiApp.
    3. scripts/Remove-PathsIgnore.ps1 is not reachable. It lives in the infrastructure repo, which Stand up the infrastructure repo and Terraform CI with drift detection #4, Replace deprecated github_repository attributes in standard.tf #7, Correct two factual errors in the Terraform design spec #8 and Harden the metadata transform against long topics and newlines #9 have each independently established is not in this organization. The edit is small enough not to need it, but the Method as written cannot be followed.

    What would unblock it

    Say which route you want:

    • Pull requests — I can take the 16 as a batch across runs, one PR per repo, each removing paths-ignore from the pull_request trigger only and leaving the push one alone. Your local work is unaffected either way.
    • Direct [skip ci] pushes to main, as the issue specifies — then it wants your machine, or somewhere the local checkouts are not in the way.

    Either way, worth re-deriving the remaining list first; I would rather not open PRs against repos that were swept in the last four weeks.


    Generated by Claude Code

  3. matt-edmondson commented on Sep 25, 2026

    @matt-edmondson
    ContributorAuthor

    The sweep was reverted, fleet-wide, and the template is why

    The "41 repos already swept" figure no longer holds for any of them. PR #26 fixes the cause; the sweep itself still needs your routing decision, so I am unassigning rather than acting on it.

    Measured

    I sampled 28 repositories against current main — the 15 this issue names as remaining, plus 13 it counts as already swept, as a control — by fetching each .github/workflows/dotnet.yml and parsing its trigger block.

    All 28 still carry paths-ignore under pull_request. The control group is the finding: CaseConverter, RunCommand, Frontmatter, Schema, Semantics, Coder, Navigation, Keybinding, FileDeduplicator, JsonRequiredConditionally, KtsuTools, PreciseNumber, TextFilter — every one of them was swept, and every one has it back.

    Why

    CaseConverter's history, confirmed by fetching the file at each SHA:

    commit date pull_request
    cf13319 "always run CI on pull requests" 2026-08-23 no filter — this issue's sweep
    a4cec36 "adopt the unified dotnet workflow" 2026-08-26 filter back
    53bf50b "adopt the consolidated .NET workflow" 2026-09-14 filter still there

    Neither revert was deliberate. Both replaced the whole workflow file from a template whose trigger block is symmetric, and 53bf50b's message describes the result as "byte-identical in every repository" — so the second revert was broadcast fleet-wide.

    The same symmetric block is in this repository, in docs/shared-ci.md, as the canonical ci.yml that "every repository holds byte-identical". Sweeping again without changing it would be reverted a third time.

    What #26 does

    Removes paths-ignore from the pull_request trigger in that template, keeps it on push (release gating runs off should_release, not the event type, so a docs-only push to main would cut a version), states the asymmetry in the document, and adds scripts/tests/shared-ci-template.tests.ps1 asserting both halves — because making the two triggers symmetric is the obvious tidy-up and is precisely what broke it twice.

    What is still open here, and why I stopped

    The count in this issue's body is stale in the unhelpful direction: it is not 16 repositories, it is all of them. The two categories it lists — seven on feature branches, nine with unpushed main commits — are also properties of your local working copies rather than of the repositories, as noted on 2026-09-22, so a branch cut from a fresh clone of origin/main sidesteps both.

    What has not changed is that the routing question from 2026-09-22 is still unanswered, and it is a bigger question now that the list is ~28 rather than 16:

    • Pull requests — one per repository, each removing paths-ignore from pull_request only. I can take these as a batch across runs.
    • Direct [skip ci] pushes to main, as the Method specifies — that wants your machine, or somewhere the local checkouts are not in the way.

    Opening that many pull requests across the org is visible enough that I would rather be told than assume.

    One more thing worth knowing for sequencing: no repository has adopted ci.yml yet. None of the 28 sampled has one, so the shared-pipeline migration has not started anywhere. CLAUDE.md describes --fallback-workflow dotnet.yml as a migration crutch that "comes off once the warnings stop"; right now it is carrying the whole fleet. If the migration is close, the cheapest route is to let it do the sweep — repositories adopting ci.yml after #26 land on a correct trigger block and need no separate visit. If it is not close, the sweep is worth doing on its own.

    Unassigning. Nothing pushed to any repository other than this one.


    Generated by Claude Code

  4. removed their assignment
    on Sep 25, 2026
  5. matt-edmondson commented on Sep 26, 2026

    @matt-edmondson
    ContributorAuthor

    Triage (re-run after 2026-09-25 update)

    • Category: Improvement (CI hygiene across the organization)
    • Priority: Medium
    • Assignment: Organization maintainer, shared workflows and templates
    • Status: The earlier sweep was undone. The workflow template re-added paths-ignore on pull_request twice, and all 28 sampled repos have it again. PR Stop the shared ci.yml template filtering paths on pull_request #26 fixes the template and is no longer open. Re-running the sweep before that fix reaches the template source would be wasted work.
    • Blocking question: Should changes go out as PRs or as direct pushes? This is still unanswered and needs a maintainer decision.
    • Related: No repository has adopted ci.yml yet, which overlaps the move onto the shared pipeline.
    • In progress: No open PR matches.

    Next step: Confirm the template fix from #26 is live, answer the PRs-or-direct-push question, then redo the sweep once.


    Generated by Claude Code

  6. matt-edmondson commented on Sep 28, 2026

    @matt-edmondson
    ContributorAuthor

    Decision (maintainer, 2026-09-28)

    Routing question answered: no separate sweep. Do the migration to ci.yml instead.

    • Move each repository off dotnet.yml and onto the shared ci.yml → ci-shared.yml pipeline. The canonical ci.yml in docs/shared-ci.md already has paths-ignore on push only (Stop the shared ci.yml template filtering paths on pull_request #26), so each migrated repo lands on the correct trigger block without a separate visit.
    • Neither PRs-per-repo nor direct [skip ci] pushes are wanted for the sweep on its own.
    • Once the migration stops producing --fallback-workflow dotnet.yml warnings in the profile README run, remove that flag (per CLAUDE.md).

    Related decisions that can ride the same per-repo migration change:

    Next reader: re-derive the list of repos still on dotnet.yml (as of 2026-09-25, none had ci.yml), then migrate them. This issue can close once no repo carries paths-ignore under pull_request.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions