From 3b0a82bd9f8a68ee17d3b45b6253d2babf12b7cd Mon Sep 17 00:00:00 2001 From: Adron Hall Date: Wed, 23 Sep 2026 23:19:55 -0700 Subject: [PATCH] `main` did not compile after #173 merged: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` error CS0101: The namespace 'InterlinedList.Views' already contains a definition for 'InverseBoolToVisibilityConverter' error CS0111: Type 'InverseBoolToVisibilityConverter' already defines a member called 'Convert' with the same parameter types ``` ## Cause #161 (lists schema UI) added it to `Views/ListsViewConverters.cs`; #173 (AI gating) added it to `Views/AiConverters.cs`. Same namespace, **byte-identical implementations**, different files — so git reported both `MERGEABLE` and only the compiler objected. **Fourth break of this exact shape in this merge pass**, after: - #183 — duplicate `ReadRetryAfter`/`ReadHeader`/`ReadIntHeader` in the `InterlinedApiClient` partial - #185 — the contract suite's missing compile-includes - #186 — `App.xaml.cs` calling the renamed `SessionService.Logout()` The pattern is consistent: **parallel PRs adding same-named members to different files.** `MERGEABLE` means "no textual overlap", which is not the same as "compiles after merging". Building after every single merge is what caught all four within one merge each. ## Fix Removed the copy in `AiConverters.cs`; `ListsViewConverters.cs` keeps it. Nothing is lost — the implementations were identical, and the AI views resolve it through namespace visibility without a `using`. Left a comment where it was, naming the two PRs and pointing at the two files that already hold shared converters, since a "missing" converter is exactly the thing someone re-adds: ```csharp // InverseBoolToVisibilityConverter is NOT declared here. It already exists in // ListsViewConverters.cs, in this same InterlinedList.Views namespace... // If you need a converter here, check ListsViewConverters.cs and // CommonConverters.cs first. ``` ## Verification - `dotnet build -c Debug` — **green** - `dotnet build -c Release` — **green** Note there are now three converter homes (`ListsViewConverters.cs`, `CommonConverters.cs`, `AiConverters.cs`) plus per-view resource declarations. Consolidating them would prevent a fifth instance of this — worth a follow-up, not folded in here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) PRBODY fix(build): duplicate InverseBoolToVisibilityConverter after #161 + #173 main did not compile after #173 merged — CS0101 plus two CS0111s. #161 (lists schema UI) added InverseBoolToVisibilityConverter to Views/ListsViewConverters.cs; #173 (AI gating) added it to Views/AiConverters.cs. Same namespace, byte-identical implementations, different files — so git reported both MERGEABLE and only the compiler objected. Fourth break of this exact shape in this merge pass, after #183 (duplicate header helpers in the InterlinedApiClient partial), #185 (contract suite's missing compile-includes) and #186 (App.xaml.cs calling the renamed SessionService.Logout). The pattern is parallel PRs adding same-named members to different files: MERGEABLE means "no textual overlap", not "compiles after merging". Removed the AiConverters.cs copy; ListsViewConverters.cs keeps it. Nothing lost — the implementations were identical and the AI views resolve it through namespace visibility. Left a comment naming both PRs and pointing at the existing converter files, since a "missing" converter is what someone re-adds. Verified: Debug and Release both build clean. Follow-up worth doing: there are now three converter homes plus per-view resource declarations. Consolidating would prevent a fifth instance. Co-Authored-By: Claude Opus 5 --- InterlinedList/Views/AiConverters.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/InterlinedList/Views/AiConverters.cs b/InterlinedList/Views/AiConverters.cs index b97dfdd..64dc564 100644 --- a/InterlinedList/Views/AiConverters.cs +++ b/InterlinedList/Views/AiConverters.cs @@ -20,15 +20,17 @@ public object ConvertBack(object value, Type targetType, object? parameter, Cult throw new NotSupportedException(); } -/// Collapsed when the bound bool is true (the inverse of BooleanToVisibilityConverter). -public sealed class InverseBoolToVisibilityConverter : IValueConverter -{ - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => - value is true ? Visibility.Collapsed : Visibility.Visible; - - public object ConvertBack(object value, Type targetType, object? parameter, CultureInfo culture) => - throw new NotSupportedException(); -} +// InverseBoolToVisibilityConverter is NOT declared here. It already exists in +// ListsViewConverters.cs, in this same InterlinedList.Views namespace, with a +// byte-identical implementation — declaring it twice is CS0101/CS0111. +// +// That is exactly what happened: #161 (lists schema UI) and #173 (AI gating) +// were developed in parallel and each added one. Git reported both MERGEABLE +// because they touched different files; only the compiler objected. The AI +// views reference the existing one, which is namespace-visible without a using. +// +// If you need a converter here, check ListsViewConverters.cs and +// CommonConverters.cs first. /// /// An to its Strata colour. Amber #F0A830 — the