Repository navigation
fix(deps): declare borrowed test packages and sync transitive binding redirects (#985) - #987
Merged
drmoisan merged 5 commits intoOct 9, 2026
Conversation
… redirects (#985) Declare Microsoft.Web.WebView2 and ObjectListView.Official in the test manifests that borrowed them, remove the duplicate WebView2.Core reference group from QuickFiler.Test, add an unconditional solution-wide binding-redirect sync pass (BindingRedirectSync.psm1) wired into Repair-PackageManifestConsistency.ps1, and add a Pester gate that fails when a project hint-paths a package its own manifest does not declare. Evidence under the feature folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gw2R64FrQkj5f88mFAe3KA
Record the fix commit, the Phase 7 integration rehearsal against the PR #984 Dependabot branch (verdict PASS) and the acceptance-criteria status (AC1 to AC6 delivered, AC7 pending CI). The rehearsal worktree cleanup was refused by the worktree-removal hook and is reported as open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gw2R64FrQkj5f88mFAe3KA
B-1: replace the encoded session-scratchpad segment carrying the operator account name in plan.2026-10-09T13-06.md line 26 with a placeholder; branch identity sweep is clean. CR-1: every binding-redirect sync repair record carries a Direction (Upgrade, Downgrade or Unknown) and the report line states it. CR-2: WrittenPath lists each path once, case-insensitively, in first-occurrence order. CR-3: the already-handled assembly-name check compares names case-insensitively. Adds regression tests N1 to N9 with fail-before and pass-after evidence, the R1 QA-gate evidence, the review artifacts, the issue 986 promoted record and the agent-memory notes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gw2R64FrQkj5f88mFAe3KA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gw2R64FrQkj5f88mFAe3KA
2 of 5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Suggested title
fix(deps): declare borrowed test packages and sync transitive binding redirects so Dependabot PRs pass CI unattended (#985)
Summary
scripts/dependencies/BindingRedirectSync.psm1, a redirect-sync pass thatRepair-PackageManifestConsistency.ps1now runs unconditionally. It rewrites anyapp.configbindingRedirectwhosenewVersionmatches no assembly version referenced in the solution, including redirects for assemblies a project receives only transitively.Microsoft.Web.WebView2in QuickFiler.Test and UtilitiesCS.Test, andObjectListView.Officialin QuickFiler.Test and TaskTree.Test. Removes a duplicateMicrosoft.Web.WebView2.Corereference fromQuickFiler.Test.csproj.RepositoryTreeConsistency.Tests.ps1assertingFind-OrphanedHintPathreports zero findings across every project, so a project cannot silently borrow another project's package again..github/workflows/**: thedependabot-repairworkflow runs the Dependabot branch's own copy of the repair script, so the new pass reaches every future Dependabot PR without a workflow edit.Upgrade/Downgradedirection,WrittenPathis de-duplicated, assembly-name comparison is case-insensitive, and an account-name fragment was removed from the committed plan.Why
Grouped NuGet Dependabot PR #984 still failed CI after the
dependabot-repairworkflow (issue #911) ran successfully. Two classes of manifest inconsistency are invisible to both Dependabot and the existing repair script, because both act only on packages a project declares in its ownpackages.config:BindingRedirectVerification.Tests.ps1. The existing redirect pass does not run from the workflow_run trigger because no-CandidateUpgradeis supplied.The objective is that future Dependabot PRs pass all required checks with no manual step.
What Changed
Core fix
scripts/dependencies/BindingRedirectSync.psm1(new): stale-only rewrite; target version is the project's own reference version when present, otherwise the highest version referenced anywhere in the solution; assemblies with no referenced version or an unparsable version are left unchanged and reported; idempotent (a second run writes nothing). Results are reported in a separateRedirectSyncfield, so the workflow'sbeyond-known-weakcount is unaffected.scripts/dependencies/Repair-PackageManifestConsistency.ps1: invokes the sync pass unconditionally before manifest normalisation; de-duplicatesWrittenPath.Project manifests
QuickFiler.Test/packages.config,UtilitiesCS.Test/packages.config,TaskTree.Test/packages.config: declare the borrowed packages at the production versions.QuickFiler.Test/QuickFiler.Test.csproj: removes the duplicate WebView2.Core item group.Tests
tests/scripts/dependencies/BindingRedirectSync.Tests.ps1(new) andtests/scripts/dependencies/Repair-PackageManifestConsistency.RedirectSync.Tests.ps1(new): in-memory fixtures only.tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1: new orphaned-hint-path gate.Docs and evidence
docs/features/active/2026-10-09-dependabot-repair-borrowed-packages-and-transitive-redirects-985/: issue, spec, research, plans, review artifacts and evidence.Architecture / How It Fits Together
dependabot-repair.yml(workflow_run after CI ondependabot/*branches) checks out the Dependabot branch and callsRepair-PackageManifestConsistency.ps1. The entry point now runs, in order: analyzer-item repair, the new redirect sync over everyapp.config, then manifest normalisation. Every written path flows intoWrittenPath, which the workflow's push gate (written-count) already reads, so a sync-only repair is pushed back to the Dependabot branch and CI re-runs. Separately, declaring the borrowed packages makes Dependabot itself update those test projects in the same grouped PR.Verification
Completed (from feature evidence)
BindingRedirectSync.psm1100% (120/120);Repair-PackageManifestConsistency.ps194.17% (baseline 94.14%).csharpier checkexit 0;msbuild /t:Rebuildwith analyzers 0 errors;msbuild /t:Rebuild /p:TreatWarningsAsErrors=true0 errors; MSTest 7427/7427 passed (four shell-icon test classes excluded locally because they hang on the development machine; CI runs the full set). C# coverage 85.41% line / 79.83% branch, unchanged.BindingRedirectVerification.Tests.ps116/16 andRepositoryTreeConsistency.Tests.ps15/5 passed.Recommended
@dependabot recreateon PR Bump the all-nuget-updates group with 16 updates #984 and confirm all required checks pass after the repair workflow runs (AC7, pending CI).Backward Compatibility / Migration Notes
RedirectSyncfield, and sync repair records carry aDirectionproperty; existing consumers in.github/andscripts/do not read the changed report line.app.configfiles on any Dependabot branch whose redirects are stale; previously those were left for a human.Risks and Mitigations
Review Guide
scripts/dependencies/BindingRedirectSync.psm1and its tests.scripts/dependencies/Repair-PackageManifestConsistency.ps1(small wiring diff).packages.configfiles andQuickFiler.Test.csproj.tests/scripts/dependencies/RepositoryTreeConsistency.Tests.ps1.Follow-ups
.github/workflows/dependabot-repair.ymllines 87-105, which predate the redirect sync pass (comment-only).@dependabot recreate.GitHub Auto-close