chore: fix VersionInfoProvider bugs, drop stale RegFree.targets entry, thin opsx prompts - #978
chore: fix VersionInfoProvider bugs, drop stale RegFree.targets entry, thin opsx prompts#978johnml1135 wants to merge 4 commits into
Conversation
This comment has been minimized.
This comment has been minimized.
Restores or reverts items with no connection to the Avalonia migration and
no stated rationale in this branch's history:
- Restore EVIDENCE_CRITERA.md (WiX3->WiX6 installer parity doc, unrelated
subsystem, deleted with no explanation anywhere in this branch).
- Restore Obj/FwBuildTasks/*.nuget.g.{props,targets} (Dependabot-generated
NuGet restore artifacts; deleting them is reasonable hygiene but unrelated
to this branch).
- Revert DistFiles/.../MorphologyParts.xml's MsFeatures layout reference
(publication -> Browse) back to its prior value: this file is consumed by
the live legacy views engine with no UIMode gate, so the change altered
today's rendering for all users with no stated rationale anywhere.
- Remove Docs/superpowers/specs/2026-06-21-dialogs-19g-design.md: a stray
file in a directory with no other presence in this repo, and its content
is stale (claims Delete-confirmation/LexReferenceDetails "shipped fully"
when both were later backed out per this same PR's own description).
Also removes three unrelated-but-legitimate fixes that were bundled in and
have been extracted to their own PR (#978,
chore/version-info-and-opsx-tooling-fixes): VersionInfoProvider.cs's
copyright/version-string fixes and its new test file, the RegFree.targets
stale ManagedVwWindow.dll reference removal, and the opsx-*.prompt.md
delegate-to-skill refactor. XmlViewsUtils.cs and FilterBar.cs's related
changes stay in this branch: the Avalonia browse table's GetRowCellStrings
depends on the former, and Src/xWorks/xWorksTests/WinFormsUiaSmokeTests.cs
(this branch's own test) asserts on the latter's new automation IDs, so
neither is cleanly separable.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
First of a 4-PR stack landing Phase 1 of the WinForms->Avalonia migration. Every Avalonia surface is gated behind the UIMode setting, which DEFAULTS TO "Legacy" (Src/Common/FwUtils/Properties/Settings.Designer.cs), so default users see no behavioral change. Contents: - The Avalonia migration framework: region/composer (FullEntryRegionComposer), the typed view-definition IR compiled from XML layouts, owned dense controls, the seam contracts, and the region-editor plugin registry. - The base detail-editor surfaces active under UIMode=New: lexiconEdit, lexiconEditPopup, notebookEdit, posEdit. - The Avalonia browse table (LexicalBrowseView, LexicalBrowseHostControl, BulkEditBarView, ClerkBrowse*) and its RecordBrowseView product wiring, shipped DORMANT (fused to base wiring; activated by the table follow-up PR). - 13 dialog UIs + a shared MessageBox riding behind UIMode=New, each verified wired to a real WinForms call site; 4 cleanly-removable unwired Avalonia dialogs backed out (SpecialCharacter, WritingSystemProperties, DeleteConfirmation, LexReferenceDetails). - ChorusNotesBarControl (the Chorus/FLExBridge notes bar) rides as a Phase-1 follow-up surface alongside the browse table and the interlinear/ rule-formula plugins -- built, but not registered in this base PR. - Migration skills/playbook (incl. the inert-surface activation recipe), the roadmap's core proposal/design/tasks/spec, and the landed openspec change specs (lexical-edit-avalonia-migration, shared-editable-virtualized-table, avalonia-multi-writing-system-text-foundation). The interlinear and rule-formula detail editors are carved out to their own stacked follow-up PRs; the inert tool lists are LexicalEditSurfaceRegistry.Phase1FollowUpSurfaceTools and LexicalEditSurfaceResolver.Phase1FollowUpBrowseTools. Migration per-screen docs (the JIRA-ticket basis) and the full 13-stage migration-program planning material live on the separate never-merged phase1-docs branch (the latter also mirrored to chore/relocate-roadmap-planning-docs). Phase 2 (avalonia-end-game: net multiplatform + shell conversion + WinForms removal) is planned only and gated on Phase 1 + tester burn-down; its proposal lives with the roadmap material above, not in this PR. Post-review cleanup folded into this commit (see PR_964_review.md for the full audit trail): - Removed content unrelated to this migration that had been swept in: an unrelated installer-docs deletion and an ungated Legacy-mode rendering change were reverted, and a misplaced/stale stray doc file was dropped. - Split two unrelated-but-legitimate fixes into their own PRs rather than carrying them here: #978 (VersionInfoProvider copyright/version-string bugs, a stale RegFree.targets entry, an opsx-prompt refactor) and #979 (a pre-existing cross-worktree test-collision bug in RealDataTestsBase, found while verifying this branch but unrelated to it). - Fixed a real build break (RecordBrowseView.cs used a pub/sub API signature main had already replaced) and a real product bug (the Avalonia refresh controller could stay unwired when a tool loads directly into UIMode=New, fixed in RecordEditView.cs). - Pared back ~7,500 lines of speculative future-phase openspec planning docs (the 13-stage migration program, legacy-screenshot-capture tooling, the end-game proposal) to a separate branch, and deleted two fully superseded proposals and stale DataTree-model-view-separation specs asserting an architecture that was never built. - Wired the one missing UIMode gate (GoLinkEntryDlgListener.OnGotoLexEntry), documented one honest parity deferral (MsaInflectionFeatureListDlgLauncher switch-tools navigation), removed dead API and orphaned localization keys, strengthened the FwAvalonia engine-isolation audit to match its own documented symbol list, fixed three evidence-language issues in Path3BundleTests, and reconciled dialog spacing tokens against real measured WinForms control geometry. Verification: whole-solution build green. Surface-registry census: 6 custom-slice classes classified (LexemeEditorBurnDownTests); 7 tools in LexicalEditSurfaceRegistry.Phase1FollowUpSurfaceTools; 8 tools in LexicalEditSurfaceResolver.Phase1FollowUpBrowseTools. Full CI-equivalent test run: all tests pass except 38 pre-existing, environment-specific RealDataTestsBase cross-worktree-collision failures (fix is PR #979, kept separate) and one test-harness limitation in RecordEditViewSwitchTests documented in PR_964_review.md (the underlying product bug is fixed; the test's idle-queue draining has a separate, deeper, pre-existing issue that needs its own follow-up). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
First of a 4-PR stack landing Phase 1 of the WinForms->Avalonia migration. Every Avalonia surface is gated behind the UIMode setting, which DEFAULTS TO "Legacy" (Src/Common/FwUtils/Properties/Settings.Designer.cs), so default users see no behavioral change. Contents: - The Avalonia migration framework: region/composer (FullEntryRegionComposer), the typed view-definition IR compiled from XML layouts, owned dense controls, the seam contracts, and the region-editor plugin registry. - The base detail-editor surfaces active under UIMode=New: lexiconEdit, lexiconEditPopup, notebookEdit, posEdit. - The Avalonia browse table (LexicalBrowseView, LexicalBrowseHostControl, BulkEditBarView, ClerkBrowse*) and its RecordBrowseView product wiring, shipped DORMANT (fused to base wiring; activated by the table follow-up PR). - 13 dialog UIs + a shared MessageBox riding behind UIMode=New, each verified wired to a real WinForms call site; 4 cleanly-removable unwired Avalonia dialogs backed out (SpecialCharacter, WritingSystemProperties, DeleteConfirmation, LexReferenceDetails). - ChorusNotesBarControl (the Chorus/FLExBridge notes bar) rides as a Phase-1 follow-up surface alongside the browse table and the interlinear/ rule-formula plugins -- built, but not registered in this base PR. - Migration skills/playbook (incl. the inert-surface activation recipe), the roadmap's core proposal/design/tasks/spec, and the landed openspec change specs (lexical-edit-avalonia-migration, shared-editable-virtualized-table, avalonia-multi-writing-system-text-foundation). The interlinear and rule-formula detail editors are carved out to their own stacked follow-up PRs; the inert tool lists are LexicalEditSurfaceRegistry.Phase1FollowUpSurfaceTools and LexicalEditSurfaceResolver.Phase1FollowUpBrowseTools. Migration per-screen docs (the JIRA-ticket basis) and the full 13-stage migration-program planning material live on the separate never-merged phase1-docs branch (the latter also mirrored to chore/relocate-roadmap-planning-docs). Phase 2 (avalonia-end-game: net multiplatform + shell conversion + WinForms removal) is planned only and gated on Phase 1 + tester burn-down; its proposal lives with the roadmap material above, not in this PR. Post-review cleanup folded into this commit (see PR_964_review.md for the full audit trail): - Removed content unrelated to this migration that had been swept in: an unrelated installer-docs deletion and an ungated Legacy-mode rendering change were reverted, and a misplaced/stale stray doc file was dropped. - Split two unrelated-but-legitimate fixes into their own PRs rather than carrying them here: #978 (VersionInfoProvider copyright/version-string bugs, a stale RegFree.targets entry, an opsx-prompt refactor) and #979 (a pre-existing cross-worktree test-collision bug in RealDataTestsBase, found while verifying this branch but unrelated to it). - Fixed a real build break (RecordBrowseView.cs used a pub/sub API signature main had already replaced) and a real product bug (the Avalonia refresh controller could stay unwired when a tool loads directly into UIMode=New, fixed in RecordEditView.cs). - Pared back ~7,500 lines of speculative future-phase openspec planning docs (the 13-stage migration program, legacy-screenshot-capture tooling, the end-game proposal) to a separate branch, and deleted two fully superseded proposals and stale DataTree-model-view-separation specs asserting an architecture that was never built. - Wired the one missing UIMode gate (GoLinkEntryDlgListener.OnGotoLexEntry), documented one honest parity deferral (MsaInflectionFeatureListDlgLauncher switch-tools navigation), removed dead API and orphaned localization keys, strengthened the FwAvalonia engine-isolation audit to match its own documented symbol list, fixed three evidence-language issues in Path3BundleTests, and reconciled dialog spacing tokens against real measured WinForms control geometry. Verification: whole-solution build green. Surface-registry census: 6 custom-slice classes classified (LexemeEditorBurnDownTests); 7 tools in LexicalEditSurfaceRegistry.Phase1FollowUpSurfaceTools; 8 tools in LexicalEditSurfaceResolver.Phase1FollowUpBrowseTools. Full CI-equivalent test run: all tests pass except 38 pre-existing, environment-specific RealDataTestsBase cross-worktree-collision failures (fix is PR #979, kept separate) and one test-harness limitation in RecordEditViewSwitchTests documented in PR_964_review.md (the underlying product bug is fixed; the test's idle-queue draining has a separate, deeper, pre-existing issue that needs its own follow-up). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jasonleenaylor
left a comment
There was a problem hiding this comment.
Looks good, Devin noted that ManagedVwWindow.dll was removed from RegFree.targets defaults but is still present in FieldWorks.exe BuildInclude.targets
@jasonleenaylor reviewed 14 files and all commit messages, and made 1 comment.
Reviewable status:complete! all files reviewed, all discussions resolved (waiting on johnml1135).
aa9fee5 to
67fcd69
Compare
Code review (automated deep review, verified against the code)Overall: the core VersionInfoProvider bug fixes are correct and well-tested — verified each against the real generated attribute shapes ( A few points: MEDIUM — the RegFree cleanup is only half-done, and overlaps PR #989This PR removes Also note: this RegFree.targets edit is the same line PR #989 removes (there it's replaced with an explanatory comment). The two PRs will conflict / one becomes a no-op — worth deciding which one carries the RegFree change and dropping it from the other. The removal is genuinely useful for LCMBrowser/GenerateHCConfig/UnicodeCharEditor/ComManifestTestHost, which hit the fallback path. LOW / nit —
|
|
Fixed the MEDIUM issue in 5b96437: removed the remaining Leaving the two LOW nits (const→static readonly, literal copyright strip) as documented trade-offs rather than churning the diff further; flag if you'd like those addressed too. |
This comment has been minimized.
This comment has been minimized.
5b96437 to
0baae87
Compare
0baae87 to
2deba4b
Compare
- VersionInfoProvider: copyright year no longer freezes at whatever year the constant was last edited, ApplicationVersion resolves from the correct assembly instead of always falling back to the entry assembly, and MajorVersion/ParseInformationalVersion index defensively instead of assuming a fixed part count. Covered by new VersionInfoProviderTests.cs. - RegFree.targets: removes a dangling ManagedVwWindow.dll entry; the project was already retired in #904/#906, so the entry pointed at nothing. - opsx-*.prompt.md: replace inlined instructions with delegation to the existing .claude/skills/openspec-*/SKILL.md files, per this repo's skills-over-inline-prompts convention. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ManagedVwWindow.dll was retired with the Linux-era view shims (#906). The RegFree.targets fallback entry was removed earlier in this PR, but BuildInclude.targets pre-populates ManagedComAssemblies explicitly for FieldWorks.exe (bypassing that fallback), so the "Could not find file" warning kept firing for the main product. Also drops the matching stale CLSID exclusion in mkall.targets. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CI's Commit messages check runs gitlint with the default title/body length rules, which several commits in this session violated (title >72 chars), breaking CI without a clear signal why. Document the limits and the local check command so future commits pass on the first try. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This branch's new content used em-dashes and a Unicode "<=" sign in a few places (opsx-explore.prompt.md, opsx-onboard.prompt.md, AGENTS.md, VersionInfoProviderTests.cs), which render poorly in some git tooling. Switch them to the ASCII "--" and "<=" forms the rest of the repo's prose and comments already use. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2deba4b to
d129ff8
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #978 +/- ##
=======================================
Coverage 38.04% 38.05%
=======================================
Files 1499 1499
Lines 350108 350113 +5
Branches 40231 40238 +7
=======================================
+ Hits 133216 133233 +17
+ Misses 187607 187589 -18
- Partials 29285 29291 +6
🚀 New features to boost your workflow:
|
This branch pulls three unrelated fixes out of #964 (the Avalonia migration
branch), where they had been bundled in by mistake: a set of
VersionInfoProviderbugs (frozen copyright year, wrong assemblyresolution, non-defensive version parsing), a stale build-file reference to
a retired COM class, and 11
.github/prompts/opsx-*.prompt.mdfilesrewritten to delegate to their matching
.claude/skills/openspec-*skillinstead of repeating the same instructions inline.
The obvious question for a three-in-one bundle like this is why it isn't
three PRs -- it's the size of the diff that argues against splitting further,
not the relatedness of the changes: each piece is small, self-contained, and
independently testable, and none of them are Avalonia-migration-specific, so
keeping #964 scoped to the migration mattered more than keeping this cleanup
maximally atomic. This has already been through one review round: a prior
pass flagged that the retired-COM-class cleanup only covered
RegFree.targetsand missedBuildInclude.targets/mkall.targets; that gapis now closed (verified below), and #989, the PR that would have collided
with the
RegFree.targetsline, was closed as a duplicate.Where to look
VersionInfoProvider.cs-- the three bug fixes, pinned by 6 new tests inVersionInfoProviderTests.csthat link the real generatedCommonAssemblyInfo.cs, so they exercise the shipped attribute shapesrather than a fake.
Build/mkall.targets-- the one remaining staleManagedVwWindowCLSIDexclusion; grepping the tree for
ManagedVwWindowtoday returns nothing,in any
*.targetsfile, on this branch or onmain..github/prompts/opsx-*.prompt.md(11 files) -- each now delegates to itsmatching
.claude/skills/openspec-*/SKILL.md; every target skilldirectory was confirmed to exist.
AGENTS.md-- documents the gitlint title/body-length limits CI enforces,since several commits in this branch's own history tripped them.
Deliberately not here
kDefaultCopyrightString/kSensitiveCopyrightStringmoved fromconstto
static readonly(needed to compute the year at runtime) is abinary-compat change for any out-of-repo consumer that inlined the old
const-- confirmed no in-repo caller does.(
.Replace("SIL International", string.Empty)) is literal, notpattern-based: fine against today's fixed template, but would leak a
future suffix (e.g. a city name) into "sensitive" output. Flagged in
review, left as a documented trade-off rather than churning the diff
further.
Extracted from #964, not stacked on it. Rebased onto
maintoday (58commits behind).
./build.ps1and./test.ps1 -TestProject "Src/Common/FwUtils/FwUtilsTests" -TestFilter "VersionInfoProviderTests"both clean on the rebased tree:
Test Run Successful. Total tests: 6.Reading this a year from now -- start here
This PR went through a real review round before this rebase: a prior pass
found a MEDIUM issue (the
ManagedVwWindow.dllcleanup was incomplete) andtwo LOW nits, and a follow-up commit fixed the MEDIUM one. That follow-up
commit's SHA (and the original bug-finding commit's SHA) are cited in the
PR's older comments but are no longer reachable history after this rebase
-- trust the grep in "Where to look" above over the old SHAs, which is why
this description states the fix as a verified-in-tree fact rather than a
commit reference.
Decisions, and why
Why
RegFree.targetsshows no diff againstmain. The original versionof this branch removed a stale
ManagedVwWindow.dllentry fromBuild/RegFree.targets. A separate PR (#989) touched the same lineindependently; #989 was closed as a duplicate once this branch's fix was
confirmed to cover the same ground, and by the time this branch was rebased
onto the current
main, that line's content already matched -- so therebase folded it to a no-op automatically. Nothing was lost; there is
simply nothing left to show.
Why the MEDIUM issue needed a second commit. The first pass only edited
RegFree.targets, whoseManagedVwWindow.dllfallback entry is gated byCondition="'@(ManagedComAssemblies)' == ''".FieldWorks.exenever hitthat fallback:
Src/Common/FieldWorks/BuildInclude.targetspopulatedManagedComAssembliesexplicitly, with its ownManagedVwWindow.dllentry,so the main executable kept emitting a "Could not find file" warning
regardless of the
RegFree.targetsedit. The follow-up removed thatBuildInclude.targetsentry and the matching stale CLSID exclusion inBuild/mkall.targets.Why the two LOW nits were left alone. Both are pre-existing-pattern
trade-offs rather than bugs introduced by this branch: the
const->static readonlychange is required to compute the copyright year atruntime, and a repo-wide grep confirmed no consumer depends on it being a
compile-time constant. The literal-string copyright strip matches the
current fixed template exactly; making it pattern-based would be defending
against a template change that has not happened, at the cost of a more
fragile regex today.
Evidence
./build.ps1succeeds on the rebased branch../test.ps1 -TestProject "Src/Common/FwUtils/FwUtilsTests" -TestFilter "VersionInfoProviderTests"--Test Run Successful. Total tests: 6,covering the copyright-year, assembly-resolution, and trailing-whitespace
fixes.
grep -rn "ManagedVwWindow" --include="*.targets" .returns no matcheson this branch, matching
main..github/prompts/opsx-*.prompt.mdfile's target skill name resolvesto an existing
.claude/skills/openspec-*/directory (checked all 11).This change is