Skip to content

Promote Develop to Main for the Hub Resync - #942

Merged
ptr727 merged 7 commits into
mainfrom
promote/develop-to-main-2026-08-30
Aug 30, 2026
Merged

Promote Develop to Main for the Hub Resync#942
ptr727 merged 7 commits into
mainfrom
promote/develop-to-main-2026-08-30

Conversation

@ptr727

@ptr727 ptr727 commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Why

Promotes the hub resync in #940 (merged to develop as 0e9b0b9) to main.

The head is promote/develop-to-main-2026-08-30 rather than develop itself, because the promotion carries one conflict and develop's required_linear_history plus its PR ruleset forbid resolving it there. That is the procedure the fleet's operational-vs-release-workflow reference sets for a conflicted promotion: resolve on a throwaway branch off main and open that into main. develop is untouched and is not deleted.

The one conflict, and why the resolution loses nothing

.github/workflows/build-docker-task.yml, modify/delete. develop retired it (spec/divergences.json gives it a retire disposition, and the publisher now reaches the hub's copy by SHA pin), while main had bumped docker/setup-buildx-action inside it to v4.3.0 in #934. Resolved by taking develop's deletion.

Nothing is lost, because the hub's build-docker-task.yml at the pinned commit a3781210c622a61bdd3bbe31a6ac7a431c4a163d already carries byte-identical SHAs for every action main had bumped in the local copy:

Action main's local pin Hub task at the pin
docker/setup-buildx-action 37fe631 v4.3.0 37fe631 v4.3.0
docker/login-action dbcb818 v4.6.0 dbcb818 v4.6.0
actions/checkout 3d3c42e v7.0.1 3d3c42e v7.0.1

The Docker Hub overview push that the deleted file did as an in-job step is relocated rather than dropped: it is now the publish-docker-readme job reaching the hub's publish-docker-readme-task.yml, same action, same repository, same Docker/README.md, still gated to main.

What main carried that develop did not

Measured against the true merge-base 57d81f5 (the last promotion, #924), main's entire unique delta is three action-pin bumps across two files:

main-only commit Content Outcome
c621049 build-docker-task.yml: setup-buildx-action v4.2.0 -> v4.3.0 Superseded, identical SHA in the hub task
56f9268 validate-task.yml: cspell-action v8.4.0 -> v9.0.1 Survives, present at validate-task.yml:82
b75d4d6 validate-task.yml: setup-uv v9.0.0 -> v10.0.1 Survives, present at validate-task.yml:94

Everything else in git log origin/develop..origin/main is a merge commit or a bump whose content was already at the merge-base. Directory.Packages.props, the usual silent-loss candidate, is unchanged on main since the base while develop moved every package forward.

The merge tree is therefore byte-identical to develop (tree a2e56c5 on both). That is the correct outcome here rather than evidence of dropped work: main had no unique content left once the two surviving bumps landed on develop independently at the same SHAs and the third file was retired.

Verification

  • No action pin in the merged tree is older than main's. Every SHA-pinned uses: matches main exactly, and no NuGet package is downgraded.
  • Build clean with TreatWarningsAsErrors, 239 of 239 tests pass on the merge result.
  • Local adversarial review of the merge resolution returned no findings.

dependabot Bot and others added 5 commits August 17, 2026 05:47
#927)

Bumps the actions-deps group with 1 update: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv).


Updates `astral-sh/setup-uv` from 9.0.0 to 10.0.1
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@c771a70...20cfd1b)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions-deps group with 1 update: [streetsidesoftware/cspell-action](https://github.com/streetsidesoftware/cspell-action).


Updates `streetsidesoftware/cspell-action` from 8.4.0 to 9.0.1
- [Release notes](https://github.com/streetsidesoftware/cspell-action/releases)
- [Changelog](https://github.com/streetsidesoftware/cspell-action/blob/main/CHANGELOG.md)
- [Commits](streetsidesoftware/cspell-action@de2a73e...e0668cf)

---
updated-dependencies:
- dependency-name: streetsidesoftware/cspell-action
  dependency-version: 9.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the actions-deps group with 1 update: [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action).


Updates `docker/setup-buildx-action` from 4.2.0 to 4.3.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](docker/setup-buildx-action@bb05f3f...37fe631)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…Chain (#940)

* Adopt the fleet LF line-ending default and renormalize the tree

The hub moved the fleet default from CRLF-with-LF-exceptions to
LF-with-a-CRLF-exception-for-bat-and-cmd. `.editorconfig` now declares
`[*] end_of_line = lf` and `.gitattributes` declares `* text=auto eol=lf`,
so git enforces the ending on checkout and renormalize rather than leaving
it to the editor. The per-type LF pins those two files carried (`*.sh`, the
husky hook, `uv.lock`, Dockerfiles, workflow YAML) are redundant under the
new default and are dropped.

`git add --renormalize .` converts the 160 tracked CRLF files to LF. Only
`.editorconfig`, `.editorconfig-checker.json` and `.gitattributes` carry
content changes; every other file in this commit is line-endings only, as
`git diff --ignore-cr-at-eol` shows. The six binary files are untouched.

* Re-vendor the carried instruction set from the hub

Carries `CLAUDE.md`, the file that imports `AGENTS.md` into a Claude Code
session, which this repo never had.

Re-vendors the verbatim sections the audit reported stale: `AGENTS.md`
"Context and Delegation Discipline" and "Where the Rules Live", and
`GOVERNANCE.md` "Durable Knowledge and Self-Improvement", "Repository
Boundaries and Write Safety", "Operational Repositories", "Hub-Hosted
Tooling", "Verification Discipline", "PR Review Etiquette", "Workflow YAML
Conventions" and "Repository Details". The repo-specific intro paragraphs,
"Devcontainer" and "Repository Layout" are intent-fidelity and stay this
repo's own.

"Running the Linters Locally" is promoted from `###` to `##`, matching the
hub's own heading level so the `AGENTS.md` rules table resolves, and takes
the hub's current content: the per-tool Docker one-liners are superseded by
the hub-hosted `scripts/docker_lint.py` wrapper. The PowerShell block goes
with them, since this repo tracks no `.ps1` file and the wrapper discovers
its own targets.

`CODESTYLE.md` takes the hub's current local-gate and Shell wording, and
`AGENTS.md` now names the `shell-codestyle` Skill alongside the other two.
The PlexCleaner .NET and Python subsections are unchanged.

`AUDIT.md` is rewritten against hub-hosted configuration: `repo-config/`
and `spec/secrets.json` are no longer carried, so the self-audit reaches
`repo-config/configure.sh check` and `spec/audit.py` from a hub checkout
rather than diffing local payloads that are about to be deleted.

`.github/copilot-instructions.md` takes the hub's current runbook, which
routes to `scripts/pr_review.py` in place of the hand-rolled GraphQL. The
"Disproved Claims" section keeps its shape and rules and carries no entry:
this repo had none of its own, and the hub's are proofs about the hub's
tree.

* Delete the retired repo-config and spec carries

`spec/divergences.json` gives both trees a `retire` disposition: the branch
rulesets, the repository settings and the secrets declaration are hub-hosted
ground truth reached from a hub checkout, not payloads a repo carries. A
carried copy can only restate the hub's computation or drift from it between
resyncs.

The inbound sweep re-points the two "Repository Layout"/"Configuration
Layout" bullets that described the directories, and drops the
`host-tools.json` note's aside citing the carried `spec/secrets.json` as
precedent for omitting a `$schema` pointer. `AUDIT.md` was already rewritten
against the hub-hosted payloads in the previous commit. The `HISTORY.md`
mention stays: it records what a past release shipped and was true then.

* Carry the .github/skills tree from the hub

`spec/files.json` declares `.github/skills` a `verbatim-tree` with `prune`,
applying to every fleet repo, so the 37 files are carried whole rather than
adapted. `scripts/carry.py apply` wrote them and reports the source and
target digests equal.

`.github/copilot-instructions.md` already points a review at
`.github/skills/code-review/SKILL.md`; until now that path resolved to
nothing here.

* Migrate the test project to Microsoft.Testing.Platform

The .NET 10 SDK refuses to run a VSTest target for a project that pulls in
`Microsoft.Testing.Platform.MSBuild`, which xunit.v3 4.0.0 does. That is
what has been failing the `Run unit tests` and `Build Docker image` jobs on
Dependabot's nuget-deps bumps (#937 to `develop`, #938 to `main`), each
re-rolled once with the same result, so the group has not landed since
xunit.v3 went to 4.0.0. ptr727/ProjectTemplate#1088 catalogs the same break
across the fleet and recommends the coverlet.MTP route, already round-tripped
in ptr727/LanguageTags#325, and this is that migration.

- `global.json` opts `dotnet test` into Microsoft.Testing.Platform. The hub
  cannot supply this file, since it lives in each consumer's own root.
- `xunit.runner.visualstudio` is dropped, being the VSTest adapter.
- `coverlet.collector` becomes `coverlet.MTP`, whose self-registration
  codegen needs the package on the test project's compile-time closure, so
  the `PrivateAssets`/`IncludeAssets` restriction the VSTest data collector
  carried is not re-applied.
- The CI unit-test step becomes `dotnet test --coverlet
  --coverlet-output-format cobertura --results-directory ./coverage`, which
  still lands Cobertura XML where the existing Codecov step reads it.
- `Docker/Dockerfile` copies `global.json` into the builder, without which
  `Docker/Build.sh`'s own `dotnet test` falls back to VSTest and fails the
  image build the same way.

The rest of the group's bumps ride along, and `ptr727.LanguageTags` and
`ptr727.Utilities` go to their current versions rather than the ones the
stale Dependabot PR names. `dotnet outdated` reports nothing outdated, and
`.config/dotnet-tools.json` is already at the current csharpier 1.3.0,
husky 0.9.1 and dotnet-outdated-tool 4.8.1.

Verified locally on the .NET 10.0.400 SDK: 239 of 239 tests pass under MTP,
Cobertura XML is produced, and `csharpier check` and `dotnet format style
--verify-no-changes` are clean.

* Adopt the hub-hosted reusable workflow chain

`spec/divergences.json` gives `build-release-task.yml`, `build-docker-task.yml`
and `get-version-task.yml` a `retire` disposition, and the audit reported
`publish-release.yml` missing its `plan` and `validate` jobs and
`merge-bot-pull-request.yml` missing `merge-bot`. Both findings are the same
migration, which the hub's `docs/reusable-workflows.md` tracks with
PlexCleaner as an open checkbox on stages 1, 3 and 4.

- `merge-bot-pull-request.yml` becomes the caller stub. The hub task is a
  superset of the two jobs carried here, and this repo passes no `rules` or
  `delete-branch` input: it has no tracker branch outside the built-in pairs,
  and `delete_branch_on_merge` is off fleet-wide.
- `publish-release.yml` gains `plan` (the hub's `publish-plan-task`), which
  replaces the `ref_name in (main, develop)` job guard and now fails a
  dispatch from any other branch rather than skipping silently, and
  `validate`, which is the gate the retired local `build-release-task` used
  to run inside itself. `publish` calls the hub's `build-release-task`, and
  `publish-docker-readme` calls the hub's task for the Docker Hub overview,
  which the retired local Docker task used to push as a step.
- `test-pull-request.yml` keeps its `push`-on-every-branch trigger and its
  aggregator, and its `smoke-build` now calls the hub release task. Both
  callers move to `permissions: {}` with a per-job `contents: read` grant, in
  place of the repository default of `write`.
- `build-executable-task.yml` is deleted with them. It is not a hub-hosted
  file, but the hub's `dotnet-publish` default builds the same seven runtimes
  with the same MSBuild properties and archives the same `PlexCleaner.7z`, so
  no hook is needed. The `docker-prepare` default likewise emits this repo's
  exact tags, `./Docker/Dockerfile` context and cache repository.

`validate-task.yml` stays carried: the hub's own unit-test step is the VSTest
invocation Microsoft.Testing.Platform rejects (ptr727/ProjectTemplate#1088).

`WORKFLOW.md` is reconciled against the new job graph, including all three
flow diagrams, D0.4 for the pin contract, the D4.1 dispatch-guard change,
D4.6 moving the validate gate to the caller, D9.5 naming a carried copy of a
hub task a defect, and a new S15 trace for a hub-pin bump. `ARCHITECTURE.md`,
`GOVERNANCE.md` "Repository Layout", `OPERATIONS.md` and `PlexCleaner.slnx`
follow the same sweep.

Verified locally: `actionlint` clean over the four workflows, markdownlint,
cspell, ruff, ruff format, mypy and editorconfig-checker clean.

* Exclude build output from the EditorConfig check

The hub's `.editorconfig-checker.json` excludes the Python cache directories
and nothing else, because editorconfig-checker normally scopes itself with
`git ls-files` and never sees ignored build output. That fails in a git
worktree, which is the layout `repo-worktree` mandates for every task: `.git`
is a pointer file there, so `git` is unusable inside the linter's container
and it falls back to walking the filesystem. It then reports 25 end-of-line
errors against `.artifacts/**` `.pdb`, `.cache`, and the MTP-generated
`SelfRegisteredExtensions.cs` after any local build.

`.editorconfig-checker.json` is `intent` fidelity in `spec/files.json`, so
this repo adds the three patterns its own `.gitignore` already lists.
Reproduced before the change and clean after, in this worktree.

* Select the test project with --project in the Docker build

The Docker image build failed on this branch with "Specifying a project for
'dotnet test' should be via '--project'". Under Microsoft.Testing.Platform,
which `global.json` now opts into, no 10.x SDK honors a positional project
path, and the two SDKs this repo meets differ only in how loudly they say
so. The 10.0.400 SDK the host pins ignores the path and resolves from the
current directory, which is why this passed locally. The newer
`dotnet-sdk-10.0` apt package the builder stage installs from `ubuntu:rolling`
fails outright.

The quiet arm is the worse one in the builder, since `/Builder` carries
neither `PlexCleaner.slnx` nor a root project for that fallback to find, so
`--project` is required there rather than merely tidier.

Verified by rebuilding the builder stage with `--no-cache-filter builder`:
239 of 239 tests pass inside the container.

* Answer the first review round

Three findings from the review, each verified before acting on it.

`createschema` now writes `PlexCleaner.schema.json` with LF and a trailing
newline, so a regeneration is byte-identical to the tracked file instead of a
whole-file working-tree diff against the repo's new LF default.

The line ending is set on that one write rather than on
`ConfigFileJsonContext`, which was the first attempt. That context also
writes the user's own `PlexCleaner.json`, through `WriteDefaultsToFile`,
`OpenAndUpgrade`'s schema upgrade, and the `RegisterInvalidFiles` ignore-list
update, so flipping it there would silently rewrite a Windows user's settings
file to LF on the next run that upgrades it. `PlexCleaner.defaults.json` is
not a beneficiary either way: its comments are hand-restored and its
`UseSystem`/`AutoUpdate` values are platform-dependent, so it cannot be
regenerated in place at all. The sidecar, tool-info and process-result
contexts keep CRLF, unchanged.

Verified: `createschema` leaves the tree clean, and `defaultsettings` against
a scratch path still writes CRLF.

`publish-release.yml`'s comment above the `plan` job said a feature-branch
dispatch resolves `publish == false`. The hub task exits with an `::error::`
instead, which this branch's own D4.1 already states.

`RegressionTests/README.md` said Python source is CRLF, which this branch
made untrue.

* Deserialize idet theory data to the type xUnit asked for

`FfMpegIdetInfoSerializer.Deserialize` called
`JsonSerializer.Deserialize<FfMpegIdetInfoSerializer>`, deserializing into
the serializer class rather than into `FfMpegIdetInfo`, and fell back to a
bare `new object()` on null. Both arms return something the
`Parse_Idet_Parse_Test` theory's `FfMpegIdetInfo` parameter cannot accept, so
any execution path that round-trips theory data through the registered
serializer fails at the parameter bind rather than in the serializer.

Proved by reflection against the built test assembly: with the old code
`Deserialize(typeof(FfMpegIdetInfo), json)` returns
`PlexCleanerTests.FfMpegIdetInfoSerializer`, and with the new code it returns
`PlexCleaner.FfMpegIdetInfo`. The whole suite is unaffected either way, 239
of 239 before and after, because the in-process run hands theory data to the
test directly rather than through the serializer, which is why this has sat
latent.

Pre-existing rather than introduced here, but the file is in the test project
this branch migrates to Microsoft.Testing.Platform, the execution host that
decides whether the round-trip happens at all, and the fix is one line.
Raised by Copilot as a body-only finding on all three review rounds.
Resolves one modify/delete conflict on
`.github/workflows/build-docker-task.yml`, taking `develop`'s deletion.

`main` had bumped `docker/setup-buildx-action` to v4.3.0 inside that file
(#934), while `develop` retired it: the file is hub-hosted per
`spec/divergences.json`, and the publisher now reaches
`ptr727/ProjectTemplate/.github/workflows/build-docker-task.yml` by pin
instead. Nothing is lost, because the hub task at the pinned commit already
carries the identical SHAs for every action `main` had bumped locally:
`setup-buildx-action` v4.3.0 `37fe631`, `login-action` v4.6.0 `dbcb813`, and
`checkout` v7.0.1 `3d3c42e`.

The resulting tree is byte-identical to `develop`, so `main` carried no other
unique content. Verified on the merge result: build clean with
`TreatWarningsAsErrors`, 239 of 239 tests pass.
Copilot AI lite review requested due to automatic review settings August 30, 2026 15:19
@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 51 seconds.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d82c4206-edda-44d3-a0db-d93bb6d7f41e

📥 Commits

Reviewing files that changed from the base of the PR and between 6a79dca and 3a733e9.

📒 Files selected for processing (213)
  • .config/dotnet-tools.json
  • .dockerignore
  • .editorconfig
  • .editorconfig-checker.json
  • .gitattributes
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/copilot-instructions.md
  • .github/dependabot.yml
  • .github/skills/add-host-tool/SKILL.md
  • .github/skills/agent-conduct/SKILL.md
  • .github/skills/audit-a-repo/SKILL.md
  • .github/skills/carried-instruction-file-guard/SKILL.md
  • .github/skills/code-review/SKILL.md
  • .github/skills/comment-and-doc-style/SKILL.md
  • .github/skills/comment-and-doc-style/references/carried-doc-references.md
  • .github/skills/comment-and-doc-style/references/line-endings.md
  • .github/skills/comment-and-doc-style/references/markdown-links.md
  • .github/skills/copilot-instructions-keeper/SKILL.md
  • .github/skills/dotnet-codestyle/SKILL.md
  • .github/skills/dotnet-codestyle/references/conventions.md
  • .github/skills/dotnet-codestyle/references/project-config.md
  • .github/skills/dotnet-codestyle/references/testing.md
  • .github/skills/drive-pr/SKILL.md
  • .github/skills/fleet-conformance-check/SKILL.md
  • .github/skills/git-commit-conventions/SKILL.md
  • .github/skills/git-commit-conventions/references/history-rewrite.md
  • .github/skills/local-strict-review/SKILL.md
  • .github/skills/merge-and-release/SKILL.md
  • .github/skills/operational-vs-release-workflow/SKILL.md
  • .github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md
  • .github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md
  • .github/skills/pr-review-conduct/SKILL.md
  • .github/skills/python-codestyle/SKILL.md
  • .github/skills/python-codestyle/references/code-style.md
  • .github/skills/python-codestyle/references/profiles.md
  • .github/skills/python-codestyle/references/testing.md
  • .github/skills/repo-worktree/SKILL.md
  • .github/skills/resync-a-repo/SKILL.md
  • .github/skills/shell-codestyle/SKILL.md
  • .github/skills/skill-lifecycle/SKILL.md
  • .github/skills/standup-a-repo/SKILL.md
  • .github/skills/upstream-contribution-workflow/SKILL.md
  • .github/skills/workflow-ci-contract/SKILL.md
  • .github/skills/workflow-ci-contract/references/d-guarantees.md
  • .github/skills/workflow-ci-contract/references/test-methodology.md
  • .github/workflows/build-docker-task.yml
  • .github/workflows/build-executable-task.yml
  • .github/workflows/build-release-task.yml
  • .github/workflows/get-version-task.yml
  • .github/workflows/merge-bot-pull-request.yml
  • .github/workflows/publish-release.yml
  • .github/workflows/test-pull-request.yml
  • .github/workflows/validate-task.yml
  • .gitignore
  • .husky/task-runner.json
  • .markdownlint-cli2.jsonc
  • .vscode/launch.json
  • .vscode/tasks.json
  • AGENTS.md
  • ARCHITECTURE.md
  • AUDIT.md
  • CLAUDE.md
  • CODESTYLE.md
  • Directory.Build.props
  • Directory.Packages.props
  • Docker/Build.sh
  • Docker/Dockerfile
  • Docker/README.md
  • Docs/ClosedCaptions.md
  • Docs/CustomOptions.md
  • Docs/LanguageMatching.md
  • GOVERNANCE.md
  • HISTORY.md
  • LICENSE
  • OPERATIONS.md
  • PlexCleaner.code-workspace
  • PlexCleaner.defaults.json
  • PlexCleaner.schema.json
  • PlexCleaner.slnx
  • PlexCleaner/AssemblyVersion.cs
  • PlexCleaner/AudioProps.cs
  • PlexCleaner/Bitrate.cs
  • PlexCleaner/BitrateInfo.cs
  • PlexCleaner/CommandLineOptions.cs
  • PlexCleaner/ConfigFileJsonSchema.cs
  • PlexCleaner/Convert.cs
  • PlexCleaner/ConvertOptions.cs
  • PlexCleaner/DtsInfo.cs
  • PlexCleaner/Extensions.cs
  • PlexCleaner/FfMpegBuilder.cs
  • PlexCleaner/FfMpegIdetInfo.cs
  • PlexCleaner/FfMpegTool.cs
  • PlexCleaner/FfMpegToolJsonSchema.cs
  • PlexCleaner/FfProbeBuilder.cs
  • PlexCleaner/FfProbeTool.cs
  • PlexCleaner/GitHubRelease.cs
  • PlexCleaner/GlobalUsings.cs
  • PlexCleaner/HandBrakeBuilder.cs
  • PlexCleaner/HandBrakeTool.cs
  • PlexCleaner/IProcessPlugin.cs
  • PlexCleaner/JsonSerialization.cs
  • PlexCleaner/KeepAwake.cs
  • PlexCleaner/Language.cs
  • PlexCleaner/LoggerFactory.cs
  • PlexCleaner/MatroskaStructure.cs
  • PlexCleaner/MediaInfoBuilder.cs
  • PlexCleaner/MediaInfoTool.cs
  • PlexCleaner/MediaInfoToolJsonSchema.cs
  • PlexCleaner/MediaInfoToolXmlSchema.cs
  • PlexCleaner/MediaInfoXmlParser.cs
  • PlexCleaner/MediaProps.cs
  • PlexCleaner/MediaTool.cs
  • PlexCleaner/MediaToolInfo.cs
  • PlexCleaner/Metrics.cs
  • PlexCleaner/MkvMergeBuilder.cs
  • PlexCleaner/MkvMergeTool.cs
  • PlexCleaner/MkvProcess.cs
  • PlexCleaner/MkvPropEditBuilder.cs
  • PlexCleaner/MkvPropEditTool.cs
  • PlexCleaner/MkvToolJsonSchema.cs
  • PlexCleaner/Monitor.cs
  • PlexCleaner/PerFileLogLevel.cs
  • PlexCleaner/PlexCleaner.csproj
  • PlexCleaner/PluginLoader.cs
  • PlexCleaner/Process.cs
  • PlexCleaner/ProcessDriver.cs
  • PlexCleaner/ProcessFile.cs
  • PlexCleaner/ProcessOptions.cs
  • PlexCleaner/ProcessResultJsonSchema.cs
  • PlexCleaner/Program.cs
  • PlexCleaner/Properties/launchSettings.json
  • PlexCleaner/SelectMediaProps.cs
  • PlexCleaner/SevenZipBuilder.cs
  • PlexCleaner/SevenZipTool.cs
  • PlexCleaner/SidecarFile.cs
  • PlexCleaner/SidecarFileJsonSchema.cs
  • PlexCleaner/SubtitleProps.cs
  • PlexCleaner/TagMap.cs
  • PlexCleaner/TagMapSet.cs
  • PlexCleaner/ToolInfoJsonSchema.cs
  • PlexCleaner/Tools.cs
  • PlexCleaner/ToolsOptions.cs
  • PlexCleaner/TrackProps.cs
  • PlexCleaner/VerifyClassifier.cs
  • PlexCleaner/VerifyOptions.cs
  • PlexCleaner/VerifyResult.cs
  • PlexCleaner/VideoProps.cs
  • PlexCleanerTests/.editorconfig
  • PlexCleanerTests/ClosedCaptionsProbeTests.cs
  • PlexCleanerTests/CommandLineTests.cs
  • PlexCleanerTests/ConfigFileTests.cs
  • PlexCleanerTests/DefaultTrackFlagsTests.cs
  • PlexCleanerTests/DtsInfoTests.cs
  • PlexCleanerTests/FfMpegIdetDecisionTests.cs
  • PlexCleanerTests/FfMpegIdetInfoSerializer.cs
  • PlexCleanerTests/FfMpegIdetParsingTests.cs
  • PlexCleanerTests/FfMpegNalUnitTests.cs
  • PlexCleanerTests/FfProbeLogTests.cs
  • PlexCleanerTests/MetricsTests.cs
  • PlexCleanerTests/PerFileLogLevelTests.cs
  • PlexCleanerTests/PlexCleanerFixture.cs
  • PlexCleanerTests/PlexCleanerTests.csproj
  • PlexCleanerTests/PluginLoaderTests.cs
  • PlexCleanerTests/ProcessDriverTests.cs
  • PlexCleanerTests/SidecarFileTests.cs
  • PlexCleanerTests/StreamTimingsProbeTests.cs
  • PlexCleanerTests/ToolFailureLogFormatTests.cs
  • PlexCleanerTests/ToolProgressParsingTests.cs
  • PlexCleanerTests/VerifyClassifierTests.cs
  • PlexCleanerTests/VersionParsingTests.cs
  • PlexCleanerTests/WildcardTests.cs
  • Plugins/DtsTimestampRepair/DtsTimestampRepair.csproj
  • Plugins/DtsTimestampRepair/DtsTimestampRepairPlugin.cs
  • Plugins/MatroskaHeaderCleanup/MatroskaCleanupPlugin.cs
  • Plugins/MatroskaHeaderCleanup/MatroskaHeaderCleanup.csproj
  • README.md
  • RegressionTests/README.md
  • RegressionTests/audit_physical.py
  • RegressionTests/catalog_corpus.py
  • RegressionTests/corpus_common.py
  • RegressionTests/locate_issue.py
  • RegressionTests/pyproject.toml
  • RegressionTests/reduce_corpus.py
  • RegressionTests/reduction-rules.example.json
  • RegressionTests/synthetic/hevc_nal.py
  • RegressionTests/synthetic/inject_cc_sei.py
  • RegressionTests/synthetic/inject_hdr10plus_sei.py
  • RegressionTests/synthetic/synthesize.py
  • Samples/PlexCleaner/PlexCleaner.v1.json
  • Samples/PlexCleaner/PlexCleaner.v2.json
  • Samples/PlexCleaner/PlexCleaner.v3.json
  • Samples/PlexCleaner/PlexCleaner.v4.json
  • Samples/PlexCleaner/Sidecar.State.PlexCleaner
  • Samples/PlexCleaner/Sidecar.v1.PlexCleaner
  • Samples/PlexCleaner/Sidecar.v2.PlexCleaner
  • Samples/PlexCleaner/Sidecar.v3.PlexCleaner
  • Samples/PlexCleaner/Sidecar.v4.PlexCleaner
  • Samples/PlexCleaner/Sidecar.v5.PlexCleaner
  • Sandbox/Program.cs
  • Sandbox/Sandbox.csproj
  • Sandbox/TestSomething.cs
  • WORKFLOW.md
  • codecov.yml
  • cspell.json
  • global.json
  • host-tools.json
  • repo-config/README.md
  • repo-config/develop.json
  • repo-config/main.json
  • repo-config/settings.json
  • spec/secrets.json
  • version.json

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

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 30, 2026

Copy link
Copy Markdown

PR Summary by Qodo

Promote Hub Resync and Centralize Release Workflows

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Promotes the fleet hub resync and replaces local release tasks with pinned reusable workflows.
• Standardizes LF endings, agent skills, governance, and repository audit ownership.
• Migrates .NET coverage to Microsoft.Testing.Platform and refreshes dependencies.
Diagram

graph TD
  A["PR CI"] --> B["Local Validation"] --> C["Required Check"]
  A --> D["Hub Release Task"] --> C
  E["Schedule or Dispatch"] --> F["Release Plan"] --> G["Hub Build Task"] --> H["GitHub and Docker"]
Loading
High-Level Assessment

The commit-pinned hub workflow model is the appropriate strategy because it removes duplicated release logic while preserving controlled, Dependabot-reviewed upgrades. Keeping local task copies would retain repository drift and conflict risk, while floating hub references would weaken reproducibility.

Files changed (204) +25524 / -22140

Bug fix (2) +373 / -355
Build.shUse MTP-compatible project selection +7/-1

Use MTP-compatible project selection

• Passes the test project through --project because Microsoft.Testing.Platform does not accept the prior positional project argument.

Docker/Build.sh

ConfigFileJsonSchema.csEmit tracked schemas with LF endings +366/-354

Emit tracked schemas with LF endings

• Writes generated PlexCleaner.schema.json with LF and a final newline while preserving CRLF for user configuration serialization. Also renormalizes the source file itself.

PlexCleaner/ConfigFileJsonSchema.cs

Refactor (78) +16137 / -16137
AssemblyVersion.csNormalize assembly version source +48/-48

Normalize assembly version source

• Renormalizes unchanged C# source to LF.

PlexCleaner/AssemblyVersion.cs

AudioProps.csNormalize audio properties source +19/-19

Normalize audio properties source

• Renormalizes unchanged C# source to LF.

PlexCleaner/AudioProps.cs

Bitrate.csNormalize bitrate source +112/-112

Normalize bitrate source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Bitrate.cs

BitrateInfo.csNormalize bitrate information source +122/-122

Normalize bitrate information source

• Renormalizes unchanged C# source to LF.

PlexCleaner/BitrateInfo.cs

CommandLineOptions.csNormalize command-line options source +492/-492

Normalize command-line options source

• Renormalizes unchanged C# source to LF.

PlexCleaner/CommandLineOptions.cs

Convert.csNormalize conversion source +185/-185

Normalize conversion source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Convert.cs

ConvertOptions.csNormalize conversion options source +163/-163

Normalize conversion options source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ConvertOptions.cs

DtsInfo.csNormalize DTS information source +53/-53

Normalize DTS information source

• Renormalizes unchanged C# source to LF.

PlexCleaner/DtsInfo.cs

Extensions.csNormalize extension methods source +29/-29

Normalize extension methods source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Extensions.cs

FfMpegBuilder.csNormalize FFmpeg builder source +278/-278

Normalize FFmpeg builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfMpegBuilder.cs

FfMpegIdetInfo.csNormalize FFmpeg idet source +264/-264

Normalize FFmpeg idet source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfMpegIdetInfo.cs

FfMpegTool.csNormalize FFmpeg tool source +542/-542

Normalize FFmpeg tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfMpegTool.cs

FfMpegToolJsonSchema.csNormalize FFmpeg schema source +199/-199

Normalize FFmpeg schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfMpegToolJsonSchema.cs

FfProbeBuilder.csNormalize FFprobe builder source +160/-160

Normalize FFprobe builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfProbeBuilder.cs

FfProbeTool.csNormalize FFprobe tool source +502/-502

Normalize FFprobe tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/FfProbeTool.cs

GitHubRelease.csNormalize GitHub release source +44/-44

Normalize GitHub release source

• Renormalizes unchanged C# source to LF.

PlexCleaner/GitHubRelease.cs

GlobalUsings.csNormalize global using aliases +3/-3

Normalize global using aliases

• Renormalizes unchanged C# source to LF.

PlexCleaner/GlobalUsings.cs

HandBrakeBuilder.csNormalize HandBrake builder source +173/-173

Normalize HandBrake builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/HandBrakeBuilder.cs

HandBrakeTool.csNormalize HandBrake tool source +160/-160

Normalize HandBrake tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/HandBrakeTool.cs

IProcessPlugin.csNormalize plugin interface source +41/-41

Normalize plugin interface source

• Renormalizes unchanged C# source to LF.

PlexCleaner/IProcessPlugin.cs

JsonSerialization.csNormalize JSON serialization source +67/-67

Normalize JSON serialization source

• Renormalizes unchanged C# source to LF.

PlexCleaner/JsonSerialization.cs

KeepAwake.csNormalize keep-awake source +42/-42

Normalize keep-awake source

• Renormalizes unchanged C# source to LF.

PlexCleaner/KeepAwake.cs

Language.csNormalize language source +31/-31

Normalize language source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Language.cs

LoggerFactory.csNormalize logger factory source +110/-110

Normalize logger factory source

• Renormalizes unchanged C# source to LF.

PlexCleaner/LoggerFactory.cs

MatroskaStructure.csNormalize Matroska structure source +180/-180

Normalize Matroska structure source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MatroskaStructure.cs

MediaInfoBuilder.csNormalize MediaInfo builder source +92/-92

Normalize MediaInfo builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaInfoBuilder.cs

MediaInfoTool.csNormalize MediaInfo tool source +248/-248

Normalize MediaInfo tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaInfoTool.cs

MediaInfoToolJsonSchema.csNormalize MediaInfo JSON schema source +106/-106

Normalize MediaInfo JSON schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaInfoToolJsonSchema.cs

MediaInfoToolXmlSchema.csNormalize MediaInfo XML schema source +94/-94

Normalize MediaInfo XML schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaInfoToolXmlSchema.cs

MediaInfoXmlParser.csNormalize MediaInfo parser source +435/-435

Normalize MediaInfo parser source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaInfoXmlParser.cs

MediaProps.csNormalize media properties source +239/-239

Normalize media properties source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaProps.cs

MediaTool.csNormalize media tool base source +515/-515

Normalize media tool base source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaTool.cs

MediaToolInfo.csNormalize media tool information source +74/-74

Normalize media tool information source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MediaToolInfo.cs

Metrics.csNormalize metrics source +233/-233

Normalize metrics source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Metrics.cs

MkvMergeBuilder.csNormalize mkvmerge builder source +197/-197

Normalize mkvmerge builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvMergeBuilder.cs

MkvMergeTool.csNormalize mkvmerge tool source +337/-337

Normalize mkvmerge tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvMergeTool.cs

MkvProcess.csNormalize MKV processing source +61/-61

Normalize MKV processing source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvProcess.cs

MkvPropEditBuilder.csNormalize mkvpropedit builder source +152/-152

Normalize mkvpropedit builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvPropEditBuilder.cs

MkvPropEditTool.csNormalize mkvpropedit tool source +205/-205

Normalize mkvpropedit tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvPropEditTool.cs

MkvToolJsonSchema.csNormalize MKV schema source +187/-187

Normalize MKV schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/MkvToolJsonSchema.cs

Monitor.csNormalize monitor source +319/-319

Normalize monitor source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Monitor.cs

PerFileLogLevel.csNormalize per-file logging source +83/-83

Normalize per-file logging source

• Renormalizes unchanged C# source to LF.

PlexCleaner/PerFileLogLevel.cs

PluginLoader.csNormalize plugin loader source +119/-119

Normalize plugin loader source

• Renormalizes unchanged C# source to LF.

PlexCleaner/PluginLoader.cs

Process.csNormalize processing source +646/-646

Normalize processing source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Process.cs

ProcessDriver.csNormalize process driver source +545/-545

Normalize process driver source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ProcessDriver.cs

ProcessFile.csNormalize file-processing source +2856/-2856

Normalize file-processing source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ProcessFile.cs

ProcessOptions.csNormalize processing options source +477/-477

Normalize processing options source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ProcessOptions.cs

ProcessResultJsonSchema.csNormalize process-result schema source +105/-105

Normalize process-result schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ProcessResultJsonSchema.cs

Program.csNormalize program entry source +587/-587

Normalize program entry source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Program.cs

SelectMediaProps.csNormalize media selection source +145/-145

Normalize media selection source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SelectMediaProps.cs

SevenZipBuilder.csNormalize 7-Zip builder source +110/-110

Normalize 7-Zip builder source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SevenZipBuilder.cs

SevenZipTool.csNormalize 7-Zip tool source +209/-209

Normalize 7-Zip tool source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SevenZipTool.cs

SidecarFile.csNormalize sidecar source +734/-734

Normalize sidecar source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SidecarFile.cs

SidecarFileJsonSchema.csNormalize sidecar schema source +327/-327

Normalize sidecar schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SidecarFileJsonSchema.cs

SubtitleProps.csNormalize subtitle properties source +163/-163

Normalize subtitle properties source

• Renormalizes unchanged C# source to LF.

PlexCleaner/SubtitleProps.cs

TagMap.csNormalize tag-map source +12/-12

Normalize tag-map source

• Renormalizes unchanged C# source to LF.

PlexCleaner/TagMap.cs

TagMapSet.csNormalize tag-map set source +139/-139

Normalize tag-map set source

• Renormalizes unchanged C# source to LF.

PlexCleaner/TagMapSet.cs

ToolInfoJsonSchema.csNormalize tool-information schema source +67/-67

Normalize tool-information schema source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ToolInfoJsonSchema.cs

Tools.csNormalize tools orchestration source +356/-356

Normalize tools orchestration source

• Renormalizes unchanged C# source to LF.

PlexCleaner/Tools.cs

ToolsOptions.csNormalize tool options source +44/-44

Normalize tool options source

• Renormalizes unchanged C# source to LF.

PlexCleaner/ToolsOptions.cs

TrackProps.csNormalize track properties source +805/-805

Normalize track properties source

• Renormalizes unchanged C# source to LF.

PlexCleaner/TrackProps.cs

VerifyClassifier.csNormalize verification classifier source +87/-87

Normalize verification classifier source

• Renormalizes unchanged C# source to LF.

PlexCleaner/VerifyClassifier.cs

VerifyOptions.csNormalize verification options source +0/-0

Normalize verification options source

• Renormalizes unchanged C# source to LF.

PlexCleaner/VerifyOptions.cs

VerifyResult.csNormalize verification result source +0/-0

Normalize verification result source

• Renormalizes unchanged C# source to LF.

PlexCleaner/VerifyResult.cs

VideoProps.csNormalize video properties source +0/-0

Normalize video properties source

• Renormalizes unchanged C# source to LF.

PlexCleaner/VideoProps.cs

DtsTimestampRepairPlugin.csNormalize DTS plugin source +0/-0

Normalize DTS plugin source

• Renormalizes unchanged plugin source to LF.

Plugins/DtsTimestampRepair/DtsTimestampRepairPlugin.cs

MatroskaCleanupPlugin.csNormalize Matroska plugin source +0/-0

Normalize Matroska plugin source

• Renormalizes unchanged plugin source to LF.

Plugins/MatroskaHeaderCleanup/MatroskaCleanupPlugin.cs

audit_physical.pyNormalize physical audit script +0/-0

Normalize physical audit script

• Renormalizes unchanged Python source to LF.

RegressionTests/audit_physical.py

catalog_corpus.pyNormalize corpus catalog script +0/-0

Normalize corpus catalog script

• Renormalizes unchanged Python source to LF.

RegressionTests/catalog_corpus.py

corpus_common.pyNormalize corpus helpers +0/-0

Normalize corpus helpers

• Renormalizes unchanged Python source to LF.

RegressionTests/corpus_common.py

locate_issue.pyNormalize issue locator script +0/-0

Normalize issue locator script

• Renormalizes unchanged Python source to LF.

RegressionTests/locate_issue.py

reduce_corpus.pyNormalize corpus reduction script +0/-0

Normalize corpus reduction script

• Renormalizes unchanged Python source to LF.

RegressionTests/reduce_corpus.py

hevc_nal.pyNormalize HEVC synthetic helper +0/-0

Normalize HEVC synthetic helper

• Renormalizes unchanged Python source to LF.

RegressionTests/synthetic/hevc_nal.py

inject_cc_sei.pyNormalize caption SEI injector +0/-0

Normalize caption SEI injector

• Renormalizes unchanged Python source to LF.

RegressionTests/synthetic/inject_cc_sei.py

inject_hdr10plus_sei.pyNormalize HDR10+ SEI injector +0/-0

Normalize HDR10+ SEI injector

• Renormalizes unchanged Python source to LF.

RegressionTests/synthetic/inject_hdr10plus_sei.py

synthesize.pyNormalize media synthesis script +0/-0

Normalize media synthesis script

• Renormalizes unchanged Python source to LF.

RegressionTests/synthetic/synthesize.py

Program.csNormalize sandbox entry source +0/-0

Normalize sandbox entry source

• Renormalizes unchanged sandbox source to LF.

Sandbox/Program.cs

TestSomething.csNormalize sandbox experiment source +8/-8

Normalize sandbox experiment source

• Renormalizes unchanged sandbox source to LF.

Sandbox/TestSomething.cs

Tests (24) +4 / -2
validate-task.ymlCollect coverage through MTP +4/-2

Collect coverage through MTP

• Changes unit-test coverage from the VSTest collector to coverlet.MTP arguments required by Microsoft.Testing.Platform.

.github/workflows/validate-task.yml

ClosedCaptionsProbeTests.csNormalize closed-caption tests +0/-0

Normalize closed-caption tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/ClosedCaptionsProbeTests.cs

CommandLineTests.csNormalize command-line tests +0/-0

Normalize command-line tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/CommandLineTests.cs

ConfigFileTests.csNormalize configuration tests +0/-0

Normalize configuration tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/ConfigFileTests.cs

DefaultTrackFlagsTests.csNormalize default-track tests +0/-0

Normalize default-track tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/DefaultTrackFlagsTests.cs

DtsInfoTests.csNormalize DTS tests +0/-0

Normalize DTS tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/DtsInfoTests.cs

FfMpegIdetDecisionTests.csNormalize idet decision tests +0/-0

Normalize idet decision tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/FfMpegIdetDecisionTests.cs

FfMpegIdetInfoSerializer.csNormalize idet test serializer +0/-0

Normalize idet test serializer

• Renormalizes unchanged test support source to LF.

PlexCleanerTests/FfMpegIdetInfoSerializer.cs

FfMpegIdetParsingTests.csNormalize idet parsing tests +0/-0

Normalize idet parsing tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/FfMpegIdetParsingTests.cs

FfMpegNalUnitTests.csNormalize NAL unit tests +0/-0

Normalize NAL unit tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/FfMpegNalUnitTests.cs

FfProbeLogTests.csNormalize FFprobe logging tests +0/-0

Normalize FFprobe logging tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/FfProbeLogTests.cs

MetricsTests.csNormalize metrics tests +0/-0

Normalize metrics tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/MetricsTests.cs

PerFileLogLevelTests.csNormalize file-log-level tests +0/-0

Normalize file-log-level tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/PerFileLogLevelTests.cs

PlexCleanerFixture.csNormalize test fixture source +0/-0

Normalize test fixture source

• Renormalizes unchanged shared test fixture source to LF.

PlexCleanerTests/PlexCleanerFixture.cs

PlexCleanerTests.csprojMigrate the test project to coverlet.MTP +0/-0

Migrate the test project to coverlet.MTP

• Removes the VSTest runner and collector references and adds the MTP-native coverage extension with compile assets available.

PlexCleanerTests/PlexCleanerTests.csproj

PluginLoaderTests.csNormalize plugin loader tests +0/-0

Normalize plugin loader tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/PluginLoaderTests.cs

ProcessDriverTests.csNormalize process driver tests +0/-0

Normalize process driver tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/ProcessDriverTests.cs

SidecarFileTests.csNormalize sidecar tests +0/-0

Normalize sidecar tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/SidecarFileTests.cs

StreamTimingsProbeTests.csNormalize stream timing tests +0/-0

Normalize stream timing tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/StreamTimingsProbeTests.cs

ToolFailureLogFormatTests.csNormalize tool failure logging tests +0/-0

Normalize tool failure logging tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/ToolFailureLogFormatTests.cs

ToolProgressParsingTests.csNormalize progress parsing tests +0/-0

Normalize progress parsing tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/ToolProgressParsingTests.cs

VerifyClassifierTests.csNormalize classifier tests +0/-0

Normalize classifier tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/VerifyClassifierTests.cs

VersionParsingTests.csNormalize version parsing tests +0/-0

Normalize version parsing tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/VersionParsingTests.cs

WildcardTests.csNormalize wildcard tests +0/-0

Normalize wildcard tests

• Renormalizes unchanged test source to LF.

PlexCleanerTests/WildcardTests.cs

Documentation (65) +6219 / -2842
copilot-instructions.mdBootstrap Copilot through review skills +66/-334

Bootstrap Copilot through review skills

• Replaces the large embedded review runbook with concise Copilot bootstrap and output requirements. Delegates review mechanics and coverage validation to hub tooling and project skills.

.github/copilot-instructions.md

SKILL.mdAdd managed host-tool skill +46/-0

Add managed host-tool skill

• Adds guidance for changing host-tool contracts, installers, documentation, and native verification together.

.github/skills/add-host-tool/SKILL.md

SKILL.mdAdd agent conduct skill +47/-0

Add agent conduct skill

• Adds decision-time rules for verification claims, user confirmation, and durable lessons.

.github/skills/agent-conduct/SKILL.md

SKILL.mdAdd repository audit skill +37/-0

Add repository audit skill

• Adds the read-only fleet conformance audit procedure and committed-report expectations.

.github/skills/audit-a-repo/SKILL.md

SKILL.mdGuard carried instruction files +31/-0

Guard carried instruction files

• Adds a procedure that preserves repository-specific instruction content during fleet resyncs.

.github/skills/carried-instruction-file-guard/SKILL.md

SKILL.mdAdd complete-diff review skill +71/-0

Add complete-diff review skill

• Defines review scope, applicable skill loading, finding quality, and machine-readable coverage markers.

.github/skills/code-review/SKILL.md

SKILL.mdAdd prose and documentation style skill +251/-0

Add prose and documentation style skill

• Adds fleet conventions for Markdown, comments, character sets, line endings, and change titles.

.github/skills/comment-and-doc-style/SKILL.md

carried-doc-references.mdDocument carried-file reference rules +61/-0

Document carried-file reference rules

• Defines which coordination references are permitted in fleet-carried documentation.

.github/skills/comment-and-doc-style/references/carried-doc-references.md

line-endings.mdDocument line-ending policy +117/-0

Document line-ending policy

• Explains LF defaults, CRLF exceptions, migration, and audit requirements.

.github/skills/comment-and-doc-style/references/line-endings.md

markdown-links.mdDocument Markdown link conventions +64/-0

Document Markdown link conventions

• Defines reference-style link usage, grouping, naming, and ordering rules.

.github/skills/comment-and-doc-style/references/markdown-links.md

SKILL.mdAdd Copilot instruction maintenance skill +95/-0

Add Copilot instruction maintenance skill

• Adds a safe synchronization procedure that preserves repository-local disproved-claim entries.

.github/skills/copilot-instructions-keeper/SKILL.md

SKILL.mdAdd .NET coding standards skill +211/-0

Add .NET coding standards skill

• Packages .NET build, analyzer, dependency, logging, code-style, and testing conventions for agent use.

.github/skills/dotnet-codestyle/SKILL.md

conventions.mdAdd detailed C# conventions +136/-0

Add detailed C# conventions

• Documents language features, naming, structure, and XML documentation patterns.

.github/skills/dotnet-codestyle/references/conventions.md

project-config.mdAdd .NET project configuration reference +21/-0

Add .NET project configuration reference

• Documents the shared and project-specific MSBuild configuration contract.

.github/skills/dotnet-codestyle/references/project-config.md

testing.mdAdd .NET testing reference +25/-0

Add .NET testing reference

• Documents xUnit v3 and AwesomeAssertions project and test conventions.

.github/skills/dotnet-codestyle/references/testing.md

SKILL.mdAdd pull-request driving skill +131/-0

Add pull-request driving skill

• Defines the feature-to-develop and promotion review loops without authorizing main merges.

.github/skills/drive-pr/SKILL.md

SKILL.mdAdd in-repository conformance skill +74/-0

Add in-repository conformance skill

• Adds a self-check for repository and machine drift against the fleet hub.

.github/skills/fleet-conformance-check/SKILL.md

SKILL.mdAdd Git commit safety skill +167/-0

Add Git commit safety skill

• Defines staging, signed identity, push authorization, history safety, and destructive-command rules.

.github/skills/git-commit-conventions/SKILL.md

history-rewrite.mdDocument safe history rewrites +24/-0

Document safe history rewrites

• Explains rewrite scoping and identity alignment required for re-signed commits.

.github/skills/git-commit-conventions/references/history-rewrite.md

SKILL.mdAdd pre-push strict review skill +71/-0

Add pre-push strict review skill

• Adds a read-only adversarial review pass before PR-bound work is pushed or declared complete.

.github/skills/local-strict-review/SKILL.md

SKILL.mdAdd promotion merge and release skill +225/-0

Add promotion merge and release skill

• Defines authorization, verification, promotion merge, release dispatch, and cleanup sequencing.

.github/skills/merge-and-release/SKILL.md

SKILL.mdAdd branching and release model skill +156/-0

Add branching and release model skill

• Documents release and operational repository branching, promotion, publishing, and conflict procedures.

.github/skills/operational-vs-release-workflow/SKILL.md

branch-protection-and-promotion.mdDocument promotion protection mechanics +110/-0

Document promotion protection mechanics

• Adds detailed ruleset, merge-method, branch-preservation, and conflict-resolution procedures.

.github/skills/operational-vs-release-workflow/references/branch-protection-and-promotion.md

release-publish-mechanics.mdDocument release task contracts +135/-0

Document release task contracts

• Defines reusable task inputs, target subsetting, artifact seams, and registry publication behavior.

.github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md

SKILL.mdAdd pull-request review conduct skill +178/-0

Add pull-request review conduct skill

• Defines head-SHA coverage, finding disposition, merge gates, and review-loop completion criteria.

.github/skills/pr-review-conduct/SKILL.md

SKILL.mdAdd Python coding standards skill +185/-0

Add Python coding standards skill

• Packages Python project profiles, tooling, layout, typing, lint, and testing conventions.

.github/skills/python-codestyle/SKILL.md

code-style.mdAdd detailed Python style reference +93/-0

Add detailed Python style reference

• Documents comments, docstrings, typing, naming, imports, and discouraged patterns.

.github/skills/python-codestyle/references/code-style.md

profiles.mdAdd Python profile reference +74/-0

Add Python profile reference

• Distinguishes build-profile projects from lint-only script trees and their toolchains.

.github/skills/python-codestyle/references/profiles.md

testing.mdAdd Python testing reference +17/-0

Add Python testing reference

• Documents the build-profile Python test structure and conventions.

.github/skills/python-codestyle/references/testing.md

SKILL.mdAdd isolated worktree skill +229/-0

Add isolated worktree skill

• Mandates per-task worktrees and documents creation, fallback, hook setup, and cleanup procedures.

.github/skills/repo-worktree/SKILL.md

SKILL.mdAdd fleet resync skill +85/-0

Add fleet resync skill

• Adds the ordered procedure for applying hub audit findings to an existing repository.

.github/skills/resync-a-repo/SKILL.md

SKILL.mdAdd shell coding standards skill +62/-0

Add shell coding standards skill

• Documents shell selection, strict-mode, pipeline, location, lint, and comment conventions.

.github/skills/shell-codestyle/SKILL.md

SKILL.mdAdd skill lifecycle guidance +49/-0

Add skill lifecycle guidance

• Documents skill source ownership, generated distributions, installation, triggers, and retirement.

.github/skills/skill-lifecycle/SKILL.md

SKILL.mdAdd repository standup skill +105/-0

Add repository standup skill

• Adds the ordered fleet onboarding procedure for new and partially configured repositories.

.github/skills/standup-a-repo/SKILL.md

SKILL.mdAdd upstream contribution skill +84/-0

Add upstream contribution skill

• Defines fork, dirty-branch, clean-history, and review iteration practices for third-party contributions.

.github/skills/upstream-contribution-workflow/SKILL.md

SKILL.mdAdd CI contract skill +47/-0

Add CI contract skill

• Packages workflow guarantees, reusable-task architecture, artifact rules, and verification obligations.

.github/skills/workflow-ci-contract/SKILL.md

d-guarantees.mdAdd condensed workflow guarantees +70/-0

Add condensed workflow guarantees

• Summarizes the fleet CI and release guarantees with their prevented failure modes.

.github/skills/workflow-ci-contract/references/d-guarantees.md

test-methodology.mdAdd workflow test methodology +27/-0

Add workflow test methodology

• Documents static audit, trace scenario, live probe, and verdict procedures.

.github/skills/workflow-ci-contract/references/test-methodology.md

AGENTS.mdRoute agents to the expanded skill set +113/-102

Route agents to the expanded skill set

• Updates the agent entry point for shell rules, review skills, local verification routing, worktrees, PR driving, and release procedures.

AGENTS.md

ARCHITECTURE.mdNormalize architecture documentation to LF +482/-481

Normalize architecture documentation to LF

• Renormalizes the application architecture guide without changing its design contracts.

ARCHITECTURE.md

AUDIT.mdMove audit baselines to the hub +31/-74

Move audit baselines to the hub

• Replaces locally carried ruleset, settings, and secret checks with commands against hub-hosted ground truth.

AUDIT.md

CLAUDE.mdAdd Claude Code instruction entry point +5/-0

Add Claude Code instruction entry point

• Imports AGENTS.md so Claude Code sessions receive the repository's canonical instructions.

CLAUDE.md

CODESTYLE.mdAdd shell style routing +78/-78

Add shell style routing

• Extends the code-style guide with the shell language policy and hub skill reference while normalizing LF endings.

CODESTYLE.md

README.mdNormalize Docker Hub documentation +35/-35

Normalize Docker Hub documentation

• Renormalizes the unchanged Docker Hub overview to LF.

Docker/README.md

ClosedCaptions.mdNormalize closed-caption documentation +186/-186

Normalize closed-caption documentation

• Renormalizes the unchanged closed-caption guide to LF.

Docs/ClosedCaptions.md

CustomOptions.mdNormalize custom-options documentation +106/-106

Normalize custom-options documentation

• Renormalizes the unchanged custom-options guide to LF.

Docs/CustomOptions.md

LanguageMatching.mdNormalize language-matching documentation +27/-27

Normalize language-matching documentation

• Renormalizes the unchanged language-matching guide to LF.

Docs/LanguageMatching.md

[Comment truncated to fit github's 65,536-char limit.]

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 30, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (2) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. PR title breaks title case 📘 Rule violation ✧ Quality
Description
The title Promote develop to main for the hub resync leaves the non-bind words develop, main,
hub, and resync lowercase. Rename it to Promote Develop to Main for the Hub Resync.
Code

GOVERNANCE.md[139]

+A PR title and a commit message share one contract: an imperative subject, 72 characters or fewer, no trailing period, no vague titles like `update stuff` or `wip` (Dependabot's `Bump X from Y to Z` is fine as-is), no unsolicited `Co-Authored-By:` lines, and no release-bump magnitude in the title, since Nerdbank.GitVersioning computes the next version from `version.json` and git history.
Relevance

●●● Strong

Recent precedent accepts documentation and naming-casing corrections; active title-case rule
directly supports this deterministic fix.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2826333 requires every non-short bind word in a non-Dependabot PR title to start
with an uppercase letter. The visible title leaves four non-bind words lowercase, while the changed
governance line confirms this PR carries a title-and-commit-message contract.

Rule 2826333: Pull request titles must use title case with lowercase short bind words, except Dependabot bumps
GOVERNANCE.md[139-139]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The pull request title does not use the required title case. Rename it to `Promote Develop to Main for the Hub Resync`.
## Issue Context
`to`, `for`, and `the` are allowed lowercase bind words, while `Develop`, `Main`, `Hub`, and `Resync` must begin with uppercase letters. The referenced changed line identifies the repository's PR-title convention; update PR metadata rather than the file.
## Fix Focus Areas
- GOVERNANCE.md[139-139]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Publishing triggers are misstated ✗ Dismissed 🐞 Bug ≡ Correctness
Description
The new release-model skill says a bot push to main triggers publishing and that the weekly
schedule publishes Docker only, but this repository's publisher has no push trigger and its
scheduled run enables both the GitHub executable release and Docker. Agents following this skill can
incorrectly expect an immediate bot-triggered release or omit the executable release when reasoning
about the weekly run.
Code

.github/skills/operational-vs-release-workflow/SKILL.md[R90-93]

+- **A human merge never auto-publishes.** Publishing fires on a **`workflow_dispatch`** of
+  `main`/`develop` (a human-initiated release), a **code-affecting bot push to `main`** (the
+  codegen App merging a Dependabot/codegen PR, gated on `github.actor` so a human
+  merge/promotion skips it), or a **weekly `schedule`** (Docker only, to refresh the base image).
Relevance

●●● Strong

Accepted precedents support correcting documentation that misstates repository behavior; this is a
concrete workflow-contract inconsistency.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added skill claims bot-push publishing and a Docker-only schedule, while the actual entry
workflow declares only workflow_dispatch and schedule, then invokes the release task with
github: true, dockerhub: true, and the .NET publish target enabled. The repository's canonical
workflow contract also explicitly says the schedule rebuilds main as a stable release plus the
latest image.

.github/skills/operational-vs-release-workflow/SKILL.md[84-94]
.github/workflows/publish-release.yml[16-20]
.github/workflows/publish-release.yml[63-87]
WORKFLOW.md[13-24]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The release-model skill describes publish triggers and scheduled outputs that do not match PlexCleaner's publisher.
## Issue Context
`publish-release.yml` runs only on manual dispatch and schedule. Its publish job enables both the GitHub release/executable target and Docker, and `WORKFLOW.md` documents the weekly run as a stable release plus the `latest` image.
## Fix Focus Areas
- .github/skills/operational-vs-release-workflow/SKILL.md[90-94]
- .github/workflows/publish-release.yml[16-20]
- .github/workflows/publish-release.yml[75-87]
- WORKFLOW.md[20-24]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. PR title breaks title case 📘 Rule violation ✧ Quality
Description
The title Promote develop to main for the hub resync leaves the non-bind words develop, main,
hub, and resync lowercase. Rename it to Promote Develop to Main for the Hub Resync.
Code

GOVERNANCE.md[139]

+A PR title and a commit message share one contract: an imperative subject, 72 characters or fewer, no trailing period, no vague titles like `update stuff` or `wip` (Dependabot's `Bump X from Y to Z` is fine as-is), no unsolicited `Co-Authored-By:` lines, and no release-bump magnitude in the title, since Nerdbank.GitVersioning computes the next version from `version.json` and git history.
Relevance

●●● Strong

Recent precedent accepts documentation and naming-casing corrections; active title-case rule
directly supports this deterministic fix.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2826333 requires every non-short bind word in a non-Dependabot PR title to start
with an uppercase letter. The visible title leaves four non-bind words lowercase, while the changed
governance line confirms this PR carries a title-and-commit-message contract.

Rule 2826333: Pull request titles must use title case with lowercase short bind words, except Dependabot bumps
GOVERNANCE.md[139-139]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The pull request title does not use the required title case. Rename it to `Promote Develop to Main for the Hub Resync`.
## Issue Context
`to`, `for`, and `the` are allowed lowercase bind words, while `Develop`, `Main`, `Hub`, and `Resync` must begin with uppercase letters. The referenced changed line identifies the repository's PR-title convention; update PR metadata rather than the file.
## Fix Focus Areas
- GOVERNANCE.md[139-139]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View medium (1)
4. Publishing triggers are misstated ✗ Dismissed 🐞 Bug ≡ Correctness
Description
The new release-model skill says a bot push to main triggers publishing and that the weekly
schedule publishes Docker only, but this repository's publisher has no push trigger and its
scheduled run enables both the GitHub executable release and Docker. Agents following this skill can
incorrectly expect an immediate bot-triggered release or omit the executable release when reasoning
about the weekly run.
Code

.github/skills/operational-vs-release-workflow/SKILL.md[R90-93]

+- **A human merge never auto-publishes.** Publishing fires on a **`workflow_dispatch`** of
+  `main`/`develop` (a human-initiated release), a **code-affecting bot push to `main`** (the
+  codegen App merging a Dependabot/codegen PR, gated on `github.actor` so a human
+  merge/promotion skips it), or a **weekly `schedule`** (Docker only, to refresh the base image).
Relevance

●●● Strong

Accepted precedents support correcting documentation that misstates repository behavior; this is a
concrete workflow-contract inconsistency.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added skill claims bot-push publishing and a Docker-only schedule, while the actual entry
workflow declares only workflow_dispatch and schedule, then invokes the release task with
github: true, dockerhub: true, and the .NET publish target enabled. The repository's canonical
workflow contract also explicitly says the schedule rebuilds main as a stable release plus the
latest image.

.github/skills/operational-vs-release-workflow/SKILL.md[84-94]
.github/workflows/publish-release.yml[16-20]
.github/workflows/publish-release.yml[63-87]
WORKFLOW.md[13-24]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The release-model skill describes publish triggers and scheduled outputs that do not match PlexCleaner's publisher.
## Issue Context
`publish-release.yml` runs only on manual dispatch and schedule. Its publish job enables both the GitHub release/executable target and Docker, and `WORKFLOW.md` documents the weekly run as a stable release plus the `latest` image.
## Fix Focus Areas
- .github/skills/operational-vs-release-workflow/SKILL.md[90-94]
- .github/workflows/publish-release.yml[16-20]
- .github/workflows/publish-release.yml[75-87]
- WORKFLOW.md[20-24]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@qodo-code-review

qodo-code-review Bot commented Aug 30, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (1) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. PR title breaks title case 📘 Rule violation ✧ Quality
Description
The title Promote develop to main for the hub resync leaves the non-bind words develop, main,
hub, and resync lowercase. Rename it to Promote Develop to Main for the Hub Resync.
Code

GOVERNANCE.md[139]

+A PR title and a commit message share one contract: an imperative subject, 72 characters or fewer, no trailing period, no vague titles like `update stuff` or `wip` (Dependabot's `Bump X from Y to Z` is fine as-is), no unsolicited `Co-Authored-By:` lines, and no release-bump magnitude in the title, since Nerdbank.GitVersioning computes the next version from `version.json` and git history.
Relevance

●●● Strong

Recent precedent accepts documentation and naming-casing corrections; active title-case rule
directly supports this deterministic fix.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2826333 requires every non-short bind word in a non-Dependabot PR title to start
with an uppercase letter. The visible title leaves four non-bind words lowercase, while the changed
governance line confirms this PR carries a title-and-commit-message contract.

Rule 2826333: Pull request titles must use title case with lowercase short bind words, except Dependabot bumps
GOVERNANCE.md[139-139]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The pull request title does not use the required title case. Rename it to `Promote Develop to Main for the Hub Resync`.

## Issue Context
`to`, `for`, and `the` are allowed lowercase bind words, while `Develop`, `Main`, `Hub`, and `Resync` must begin with uppercase letters. The referenced changed line identifies the repository's PR-title convention; update PR metadata rather than the file.

## Fix Focus Areas
- GOVERNANCE.md[139-139]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Publishing triggers are misstated ✗ Dismissed 🐞 Bug ≡ Correctness
Description
The new release-model skill says a bot push to main triggers publishing and that the weekly
schedule publishes Docker only, but this repository's publisher has no push trigger and its
scheduled run enables both the GitHub executable release and Docker. Agents following this skill can
incorrectly expect an immediate bot-triggered release or omit the executable release when reasoning
about the weekly run.
Code

.github/skills/operational-vs-release-workflow/SKILL.md[R90-93]

+- **A human merge never auto-publishes.** Publishing fires on a **`workflow_dispatch`** of
+  `main`/`develop` (a human-initiated release), a **code-affecting bot push to `main`** (the
+  codegen App merging a Dependabot/codegen PR, gated on `github.actor` so a human
+  merge/promotion skips it), or a **weekly `schedule`** (Docker only, to refresh the base image).
Relevance

●●● Strong

Accepted precedents support correcting documentation that misstates repository behavior; this is a
concrete workflow-contract inconsistency.

PR-#767

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added skill claims bot-push publishing and a Docker-only schedule, while the actual entry
workflow declares only workflow_dispatch and schedule, then invokes the release task with
github: true, dockerhub: true, and the .NET publish target enabled. The repository's canonical
workflow contract also explicitly says the schedule rebuilds main as a stable release plus the
latest image.

.github/skills/operational-vs-release-workflow/SKILL.md[84-94]
.github/workflows/publish-release.yml[16-20]
.github/workflows/publish-release.yml[63-87]
WORKFLOW.md[13-24]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The release-model skill describes publish triggers and scheduled outputs that do not match PlexCleaner's publisher.

## Issue Context
`publish-release.yml` runs only on manual dispatch and schedule. Its publish job enables both the GitHub release/executable target and Docker, and `WORKFLOW.md` documents the weekly run as a stable release plus the `latest` image.

## Fix Focus Areas
- .github/skills/operational-vs-release-workflow/SKILL.md[90-94]
- .github/workflows/publish-release.yml[16-20]
- .github/workflows/publish-release.yml[75-87]
- WORKFLOW.md[20-24]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 4 rules
Review mode: ⚖️ Balanced

Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread GOVERNANCE.md
Comment thread .github/skills/operational-vs-release-workflow/SKILL.md

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Needs a closer look

It is a broad promotion touching CI/workflow wiring, build/release infrastructure, and test/coverage runner behavior across many files.

Pull request overview

Promotes the already-merged hub resync work from develop to main, resolving the single modify/delete conflict by accepting develop’s retirement of the local Docker build task and standardizing the repo on the hub-hosted reusable workflow chain and Microsoft.Testing.Platform-based test/coverage flow.

Changes:

  • Retires locally-carried config/spec/workflow task files in favor of hub-hosted reusable workflows and hub-side configuration sources.
  • Switches unit test + coverage execution to Microsoft.Testing.Platform with coverlet.MTP and updates CI + Docker build to match.
  • Normalizes repo text handling (notably line endings via .gitattributes) and updates supporting docs/tooling files accordingly.
File summaries
File Description
version.json No functional change; formatting/normalization only.
spec/secrets.json Removed (retired local secrets spec).
Sandbox/TestSomething.cs Formatting/normalization only.
Sandbox/Sandbox.csproj Formatting/normalization only.
Samples/PlexCleaner/PlexCleaner.v1.json Formatting/normalization only.
repo-config/settings.json Removed (retired repo-config payload).
repo-config/main.json Removed (retired repo-config payload).
repo-config/develop.json Removed (retired repo-config payload).
RegressionTests/synthetic/inject_cc_sei.py Formatting/normalization only.
RegressionTests/reduction-rules.example.json Formatting/normalization only.
RegressionTests/pyproject.toml Formatting/normalization only.
Plugins/MatroskaHeaderCleanup/MatroskaHeaderCleanup.csproj Formatting/normalization only.
Plugins/DtsTimestampRepair/DtsTimestampRepair.csproj Formatting/normalization only.
PlexCleanerTests/WildcardTests.cs Formatting/normalization only.
PlexCleanerTests/ToolProgressParsingTests.cs Formatting/normalization only.
PlexCleanerTests/StreamTimingsProbeTests.cs Formatting/normalization only.
PlexCleanerTests/ProcessDriverTests.cs Formatting/normalization only.
PlexCleanerTests/PluginLoaderTests.cs Formatting/normalization only.
PlexCleanerTests/PlexCleanerTests.csproj Migrate test coverage package to coverlet.MTP; drop VSTest runner adapter.
PlexCleanerTests/FfProbeLogTests.cs Formatting/normalization only.
PlexCleanerTests/FfMpegNalUnitTests.cs Formatting/normalization only.
PlexCleanerTests/FfMpegIdetInfoSerializer.cs Fix serializer deserialization target type and null handling.
PlexCleanerTests/ClosedCaptionsProbeTests.cs Formatting/normalization only.
PlexCleanerTests/.editorconfig Formatting/normalization only.
PlexCleaner/VerifyResult.cs Formatting/normalization only.
PlexCleaner/VerifyOptions.cs Formatting/normalization only.
PlexCleaner/VerifyClassifier.cs Formatting/normalization only.
PlexCleaner/ToolsOptions.cs Formatting/normalization only.
PlexCleaner/ToolInfoJsonSchema.cs Formatting/normalization only.
PlexCleaner/TagMap.cs Formatting/normalization only.
PlexCleaner/PerFileLogLevel.cs Formatting/normalization only.
PlexCleaner/MkvProcess.cs Formatting/normalization only.
PlexCleaner/MediaToolInfo.cs Formatting/normalization only.
PlexCleaner/MediaInfoBuilder.cs Formatting/normalization only.
PlexCleaner/Language.cs Formatting/normalization only.
PlexCleaner/KeepAwake.cs Formatting/normalization only.
PlexCleaner/JsonSerialization.cs Formatting/normalization only.
PlexCleaner/IProcessPlugin.cs Formatting/normalization only.
PlexCleaner/GlobalUsings.cs Formatting/normalization only.
PlexCleaner/GitHubRelease.cs Formatting/normalization only.
PlexCleaner/Extensions.cs Formatting/normalization only.
PlexCleaner/DtsInfo.cs Formatting/normalization only.
PlexCleaner/AudioProps.cs Formatting/normalization only.
PlexCleaner/AssemblyVersion.cs Formatting/normalization only.
PlexCleaner.code-workspace Formatting/normalization only.
LICENSE Formatting/normalization only.
host-tools.json Formatting/normalization only.
global.json Add Microsoft.Testing.Platform runner selection for dotnet test.
Docs/LanguageMatching.md Formatting/normalization only.
Docker/README.md Formatting/normalization only.
Docker/Dockerfile Copy global.json into builder stage so dotnet test uses MTP during image build.
Docker/Build.sh Use dotnet test --project ... to satisfy MTP runner argument requirements.
Directory.Packages.props Update package set for MTP + coverlet.MTP + xUnit updates; remove VSTest-only packages.
Directory.Build.props Formatting/normalization only.
codecov.yml Formatting/normalization only.
CLAUDE.md Add Claude Code entry-point file routing to AGENTS.md.
.markdownlint-cli2.jsonc Formatting/normalization only.
.husky/task-runner.json Formatting/normalization only.
.gitignore Formatting/normalization only.
.github/workflows/validate-task.yml Switch CI test+coverage to coverlet.MTP (--coverlet flow) under MTP.
.github/workflows/test-pull-request.yml CI now calls hub build-release-task.yml for smoke builds; restrict token scopes.
.github/workflows/publish-release.yml Publisher now uses hub reusable release chain + plan/validate gating; restrict token scopes.
.github/workflows/merge-bot-pull-request.yml Replace in-repo merge-bot implementation with hub reusable merge-bot task.
.github/workflows/get-version-task.yml Removed (superseded by hub reusable workflow chain).
.github/workflows/build-executable-task.yml Removed (superseded by hub reusable workflow chain).
.github/workflows/build-docker-task.yml Removed (superseded by hub reusable workflow chain).
.github/skills/workflow-ci-contract/references/test-methodology.md Add workflow testing methodology reference doc.
.github/skills/upstream-contribution-workflow/SKILL.md Add upstream contribution workflow skill doc.
.github/skills/shell-codestyle/SKILL.md Add shell codestyle skill doc.
.github/skills/python-codestyle/references/testing.md Add Python testing conventions reference.
.github/skills/python-codestyle/references/profiles.md Add Python profile details reference.
.github/skills/python-codestyle/references/code-style.md Add Python code style reference.
.github/skills/git-commit-conventions/references/history-rewrite.md Add history rewrite/signing reference.
.github/skills/fleet-conformance-check/SKILL.md Add fleet conformance check skill doc.
.github/skills/dotnet-codestyle/references/testing.md Add .NET testing conventions reference.
.github/skills/dotnet-codestyle/references/project-config.md Add .NET project configuration reference.
.github/skills/dotnet-codestyle/references/conventions.md Add .NET coding standards reference.
.github/skills/copilot-instructions-keeper/SKILL.md Add Copilot instructions keeper skill doc.
.github/skills/comment-and-doc-style/references/markdown-links.md Add reference-style link conventions doc.
.github/skills/comment-and-doc-style/references/carried-doc-references.md Add carried-doc reference rules doc.
.github/skills/code-review/SKILL.md Add code-review skill doc.
.github/skills/carried-instruction-file-guard/SKILL.md Add carried instruction file guard skill doc.
.github/skills/audit-a-repo/SKILL.md Add audit-a-repo skill doc.
.github/skills/add-host-tool/SKILL.md Add add-host-tool skill doc.
.github/ISSUE_TEMPLATE/config.yml Formatting/normalization only.
.github/dependabot.yml Formatting/normalization only.
.gitattributes Normalize text files to LF by default; pin .bat/.cmd to CRLF.
.editorconfig-checker.json Add excludes for common generated/cache directories.
.dockerignore Formatting/normalization only.
.config/dotnet-tools.json Formatting/normalization only.
Review details
  • Files reviewed: 73/213 changed files
  • Comments generated: 0
  • Review effort level: Lite

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

@ptr727 ptr727 changed the title Promote develop to main for the hub resync Promote Develop to Main for the Hub Resync Aug 30, 2026
@ptr727

ptr727 commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

Answering both Qodo findings here as well as in their threads, since a Qodo finding carries no resolvable state of its own.

1. "PR title breaks title case" (📘 Rule violation, ✧ Quality). Correct, and fixed: the title is now "Promote Develop to Main for the Hub Resync". GOVERNANCE.md "Pull Request Title and Commit Message Conventions" is title case with lowercase short bind words (a, an, the, and, but, or, of, in, on, at, to, by, for, from), so to, for and the stay lowercase and the rest capitalize.

2. "Publishing triggers are misstated" (🐞 Bug, ≡ Correctness). The observation is right and the location is not, so declining rather than editing.

Verified against the diff rather than taking the badge: this repository's publish-release.yml declares workflow_dispatch and schedule only, with no push trigger, and the scheduled run passes github: true alongside dockerhub: true, so the weekly run does publish the executable release and not only the image. Qodo has both facts right.

The file it flags, .github/skills/operational-vs-release-workflow/SKILL.md, is carried fleet content. spec/files.json declares .github/skills a verbatim-tree with prune, and scripts/carry.py wrote all 37 files from the hub at pin a3781210c622a61bdd3bbe31a6ac7a431c4a163d with source and target digests equal. It states the fleet's general model and already caveats per-repository variation ("A source-only repo publishes on dispatch only"). Per GOVERNANCE.md "Reviewing Carried Fleet Content", a local edit is not the fix: the next carry reverts it and the audit fails on the tree digest.

What governs this repository is its own WORKFLOW.md, which is unambiguous and self-consistent. D4.1: "publish-release triggers are schedule (weekly) and workflow_dispatch only. There is no push trigger and no PUBLISH_ON_MERGE variable." D4.2 covers the scheduled run building both targets in full, and trace S8 states that a merged dependency bump produces no release and ships in the next weekly run.

If the fleet wants that variant enumerated in the skill, it is a ptr727/ProjectTemplate change that re-vendors everywhere, not a PlexCleaner one.

ptr727 added 2 commits August 30, 2026 14:28
…ge (#943)

* Switch the coverage engine to Microsoft.Testing.Extensions.CodeCoverage

ptr727/ProjectTemplate#1088 resolved its open decision to
`Microsoft.Testing.Extensions.CodeCoverage` rather than `coverlet.MTP`, and
hub `WORKFLOW.md` D1.6 now binds an MTP-based repo, in practice any repo on
xunit.v3 4.0.0 or later, to that package at 18.9.0 or later in place of
`coverlet.collector`. PlexCleaner became MTP-based in #940, so the "migration
still owed rather than drift" exemption D1.6 grants a repo that is not yet
MTP-based no longer covers it. #940 chose coverlet.MTP on the strength of the
issue's original recommendation, before that decision was recorded.

- `Microsoft.Testing.Extensions.CodeCoverage` 18.10.0 replaces `coverlet.MTP`,
  central-managed as an exact pin rather than a range.
- The CI step becomes `dotnet test --coverage --coverage-output-format
  cobertura --results-directory ./coverage`, byte-identical to the hub
  validator's own, so the two gates cannot drift on coverage.
- `--coverage-output` stays unset, since pinning one filename gives every test
  project in the solution the same path and the last to finish overwrites the
  rest. The `<guid>.cobertura.xml` default it writes instead is a name
  `codecov-cli`'s file finder does not match, its patterns being `*coverage*.*`
  and an exact `cobertura.xml`, so each report is prefixed to
  `coverage-<guid>.cobertura.xml` rather than renamed, keeping the guid.
- `.gitignore` gains `*.cobertura.xml` and `TestResults/`, which D1.6 names.
  A run that passes no results directory writes `./TestResults/<guid>.cobertura.xml`.

The 18.9.0 floor takes two reasons and the comments now carry both, because
the first alone would justify lowering it to 18.1.0. Below 18.1.0 the
extension is built against Microsoft.Testing.Platform 1.x and an 18.0.x
resolution throws a `TypeLoadException` against the 2.x platform xunit.v3
4.0.0 carries, runs zero tests, and still writes a well-formed Cobertura file
reporting full coverage, so only the non-zero exit says the run reported
nothing. 18.9.0 is then the first release on Microsoft.Testing.Platform 2.3.x,
where every test project writes into the one shared results directory the
invocation names.

Verified on the .NET 10.0.400 SDK: the graph resolves 18.10.0 over
Microsoft.Testing.Platform 2.3.3, 239 of 239 tests pass at exit 0, the report
carries real data (`line-rate="0.501"`) rather than the full-coverage artifact
the floor warns about, the raw name is `<guid>.cobertura.xml` and the prefixed
name matches codecov's finder, and the Docker builder's own `dotnet test`
still passes 239 of 239.

Also corrects four sites, and one comment this change added, that said the hub
still ran the VSTest invocation and that adopting its task would be a
deletion. ptr727/ProjectTemplate#1107 migrated the hub's step, so that is no
longer the blocker. What blocks adoption now is that the hub's task declares
no `ref` input and checks out the caller's default ref, where
`publish-release.yml`'s `validate` job passes `github.sha` so the publish gate
validates the exact commit being published, per D4.6.

* Name the package this change actually replaces

Both comments described the extension as replacing `coverlet.collector`,
which is D1.2's own wording for the fleet baseline but not what happens here:
this repository was on `coverlet.MTP`, chosen in #940 before
ptr727/ProjectTemplate#1088 resolved the fleet on this package. A reader of
these files sees a replacement that did not occur.

Both now name `coverlet.MTP` as the thing displaced and keep
`coverlet.collector` as the baseline further back, so the comment matches the
diff and still connects to D1.2's wording.

The test project's comment also drops the sentence about
`xunit.runner.visualstudio`, which #940 removed and this change does not
touch, and records instead that the compile-time closure requirement is
enforced by a build failure, since the generated `SelfRegisteredExtensions.cs`
calls into the package directly.
Copilot AI review requested due to automatic review settings August 30, 2026 21:30

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Approval recommended

The changes look consistent with the stated promotion/resync intent, and the only identified issue is a minor test assertion-style inconsistency.

Review details
  • Files reviewed: 73/213 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@ptr727

ptr727 commented Aug 30, 2026

Copy link
Copy Markdown
Owner Author

Round 2 on head 3a733e9, after the coverage-engine swap (#943) landed on develop and was merged up into this branch.

Copilot: 🟢 Approval recommended. Its one remaining note is "a minor test assertion-style inconsistency", which is the native-xUnit-assertions item already inventoried and deferred as #941. That is unchanged by this promotion, and all four affected files are line-endings-only in this diff.

Qodo's "PR title breaks title case" is stale. It was raised on round 1 and fixed then; the title has read "Promote Develop to Main for the Hub Resync" since, which satisfies GOVERNANCE.md's title case with lowercase short bind words. Qodo carries no resolvable state of its own, so it re-lists the finding rather than clearing it. Its second round-1 finding, on the carried operational-vs-release-workflow skill, was answered and declined in its thread and in the conversation above.

What changed since round 1. develop gained #943, which swaps coverlet.MTP for Microsoft.Testing.Extensions.CodeCoverage 18.10.0 per the decision recorded on ptr727/ProjectTemplate#1088 and the version floor hub D1.6 states. That merged into this branch with no conflict, and the merge tree is again byte-identical to develop. Re-verified on the merge result: build clean under TreatWarningsAsErrors, 239 of 239 tests pass under MTP with a real Cobertura report.

State: merge=CLEAN, checks 17/17, no unresolved thread.

@ptr727
ptr727 merged commit f111ee7 into main Aug 30, 2026
18 checks passed
@ptr727
ptr727 deleted the promote/develop-to-main-2026-08-30 branch August 30, 2026 22:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants