Skip to content

feat: L1 provider detection, SelectMethod enforcement, ContosoUniversity Run 19#425

Merged
csharpfritz merged 35 commits intoFritzAndFriends:devfrom
csharpfritz:squad/post-implicit-conversions
Mar 11, 2026
Merged

feat: L1 provider detection, SelectMethod enforcement, ContosoUniversity Run 19#425
csharpfritz merged 35 commits intoFritzAndFriends:devfrom
csharpfritz:squad/post-implicit-conversions

Conversation

@csharpfritz
Copy link
Collaborator

Summary

This PR adds database provider auto-detection to the L1 migration script, enforces SelectMethod as mandatory delegates in all skill files, and includes ContosoUniversity Run 19 migration results (0 build errors, SQL Server LocalDB).

Key Changes

L1 Script - Auto-Detect Database Provider

  • New Find-DatabaseProvider function parses Web.config connectionStrings
  • Scaffolds the MATCHING EF Core provider package (not hardcoded SqlServer)
  • Includes actual connection string in scaffolded Program.cs
  • New [DatabaseProvider] review item in L1 output

Skill Files - SelectMethod + Database Enforcement

  • Removed 'Prefer SQLite for local dev' (root cause of SQLite contamination)
  • Reframed as 'detect and match the original provider'
  • Made SelectMethod->delegate MANDATORY (closed Items= escape hatch)

ContosoUniversity Run 19

  • Build: 0 errors
  • L1: 0.62s, L2: ~22 min
  • SQL Server LocalDB (NOT SQLite)
  • Report: dev-docs/migration-tests/contosouniversity/run19/REPORT.md

csharpfritz and others added 30 commits March 11, 2026 09:09
- Branch recreated from dev (not main) per team directive
- All 155 dev-docs files restored from feature branch
- AfterContosoUniversity migrated app restored
- ContosoUniversity.AcceptanceTests restored (40 tests)

Fixed issue: Students without enrollments now appear in GridView
- Changed LoadStudentEnrollments() to load all students with left join
- Previously only students WITH enrollments were displayed
- Now using Students.Include(Enrollments) instead of Enrollments.Include(Student)

Test Results: 40/40 passing (100%)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reorganized the migration-tests folder from a flat directory with
inconsistent naming into a clean hierarchical structure:

- wingtiptoys/run01-run17/ (16 runs, run07 skipped)
- contosouniversity/run01-run18/ (18 runs, renumbered to fix collisions)

Key changes:
- All runs now in project/runNN/ folders with zero-padded numbers
- Merged standalone .md reports into run folders as summary.md
- Renamed lowercase report.md to REPORT.md for consistency
- Removed 5 duplicate root-level screenshots (identical to run13)
- Resolved Contoso run11/12 numbering collisions (Mar 9 vs Mar 10
  runs with same number); Mar 10+ runs renumbered 13-18
- Completely rewrote README.md with all 18 Contoso runs documented
- Created placeholder for run18 (original files were untracked)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Appended migration-tests reorganization learnings to Beast history.
Created decision inbox entry for the folder restructuring.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-service-extensions-and-exec-summary
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 3 decision(s) from inbox into decisions.md
- Propagated updates to agent history files (beast, cyclops, forge, jubilee, rogue, colossus)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Re-ran Layer 1 migration after Test-UnconvertiblePage script fix
(path-based Checkout detection). ShoppingCart.razor is STILL stubbed
due to a second false positive: the 'PayPal' pattern matches an image
URL and alt text in markup, not actual PayPal SDK code.

Results:
- Layer 1: 32 files, 303 transforms, 1.58s
- Stubs: 6 (unchanged - PayPal false positive persists)
- Build: 6 errors (same Parameter TODO annotation bug)
- Report updated with Run 18b section
- Decision filed for PayPal pattern fix

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…n removal

ShoppingCart.razor now contains full GridView with BoundField/TemplateField
markup instead of a stub. Two false-positive patterns in Test-UnconvertiblePage
have been fixed:
1. 'Checkout' content pattern replaced with path-based '^Checkout[/\\]'
2. 'PayPal' content pattern removed (matched image URLs, not SDK code)

Results:
- UnconvertibleStub count: 5 (Checkout/ only, down from 6)
- Transforms: 314 (up from 303)
- Layer 1 timing: 1.51s
- Build: 6 pre-existing errors in ProductDetails/ProductList (P1, separate)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…exec summary update

- ShoppingCart.razor now uses BWFC GridView with BoundField/TemplateField
- Fixed GetCartId() to read WingtipToysCartId cookie (was hardcoded 'sample-cart')
- Fixed migration script: removed 'Checkout' and 'PayPal' false-positive patterns
- Regenerated performance charts with Run 18 data (1.51s L1, 314 transforms)
- 4 screenshots captured: Home, Products, Shopping Cart (GridView), Product Details
- Executive Summary updated: Run 18 screenshots, GridView milestone, improved strategy section
- Run 18 REPORT.md updated with build success and Layer 2 fix documentation
- ServiceCollectionExtensions: merged with WebApplicationExtensions
- Added AspxRewriteMiddleware, BlazorWebFormsComponentsOptions
- ContosoUniversity folder reorganization

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ations

Session: 2026-03-11-run18-improvements
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-11-run18-improvements.md
- Merged Forge's Run 18 improvement recommendations into decisions.md
- Merged Cyclops Run 18 checkout/PayPal/GridView fix decisions
- Merged Beast chart generation decision
- Merged user directives (eliminate Test-UnconvertiblePage, standardize ItemType, P0-2 approved)
- Consolidated 3 overlapping Test-UnconvertiblePage decisions into 1
- Propagated team updates to Cyclops, Beast, and Forge histories

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… components

Renamed TItemType -> ItemType in DataBoundComponent and SelectHandler.
Renamed TItem -> ItemType in BaseListControl, BulletedList, CheckBoxList,
DropDownList, ListBox, and RadioButtonList (both .razor and .razor.cs files).

This aligns all generic type parameters with the ASP.NET Web Forms
DataBoundControl.ItemType convention, ensuring BWFC's drop-in replacement
promise matches the original attribute names.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
First migration run with:
- Test-UnconvertiblePage eliminated (0 stubs, all pages converted)
- RouteData [Parameter] annotation bug fixed
- ItemType standardized across BWFC library

Results: 1.76s, 348 transforms, 32 files  35 razor files
Build: 184 errors (expected L2 residuals), 122 warnings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add prominent 'Migration Pipeline  MANDATORY' section to bwfc-migration SKILL.md
  with critical warning admonition, pipeline step table, exact bwfc-migrate.ps1
  invocation command, Layer 2 Copilot transform checklist, and pipeline rules
- Fix all TItem references  ItemType throughout bwfc-migration SKILL.md (8 instances)
  to match standardized Web Forms DataBoundControl.ItemType naming
- Update migration-standards SKILL.md: rename 'Layer 2 (Manual)' to
  'Layer 2 (Copilot-Assisted)', add critical warning and script invocation command,
  expand Layer 2 transform list
- Add decision file and update Beast history

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-migration-pipeline-rules
Requested by: Jeffrey T. Fritz

Changes:
- logged session to .ai-team/log/
- merged 4 decisions from inbox into decisions.md
- consolidated 8 overlapping blocks into 3
- propagated updates to beast, cyclops, forge, jubilee, rogue history files
- summarized beast and cyclops history.md (both exceeded 12KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Layer 1 (script): 1.70s, 348 transforms, 32 files, 0 stubs
Layer 2 (Copilot): ~25 min, ~60 files transformed
Build: 0 errors, 4 warnings (NuGet pruning only)

Key improvements since Run 18:
- Zero stubs (P0-1 fix)
- Mandatory L1L2 pipeline (no fixes between layers)
- ItemType standardization across all BWFC controls
- IDbContextFactory pattern for async data loading

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
L1 Script (bwfc-migrate.ps1):
- SelectMethod now PRESERVED in markup (was stripped)  BWFC supports it natively
- ContentPlaceHolder review items note BWFC components are available
- GetRouteUrl review items reference GetRouteUrlHelper utility

Skills (3 files, 15 references updated):
- SelectMethod guidance: preserve + convert to delegate (not replace with Items)
- All three skill files aligned on SelectHandler<ItemType> delegate pattern

Run 20 Report:
- Removed false claim that validators don't exist (all 6 exist)
- Fixed SelectMethod L2 transform description

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-selectmethod-fix
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-11-selectmethod-fix.md
- Merged 3 decision(s) from inbox into decisions.md
- Consolidated 3 overlapping SelectMethod decisions into 1
- Propagated updates to 6 agent history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cyclops: 16181 -> 7853 bytes (archived ServiceCollectionExtensions, Run 18, P0 fixes, ItemType, L2 transform)
Beast: 12969 -> 9509 bytes (archived Run 10 failure, Run 11 skill fixes, team updates 2026-03-07/08)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lers

- Login.razor.cs: Add Email, Password fields and LogIn handler
- Register.razor.cs: Add Email, Password fields and CreateUser_Click handler
- Forgot.razor/.cs: Rename OnClick='Forgot' to 'Forgot_Click' (class name conflict), add Email field
- ResetPassword.razor.cs: Add Email, Password fields and Reset_Click handler
- ManagePassword.razor.cs: Add Password field, SetPassword_Click and ChangePassword_Click handlers
- ManageLogins.razor/.cs: Fix <%# %> Web Forms syntax, add SuccessMessage and GetLogins stub
- Manage.razor.cs: Add SuccessMessage and LoginsCount fields
- RegisterExternalLogin.razor.cs: Add ProviderName, Email fields and LogIn_Click handler
- OpenAuthProviders.razor/.cs: Add GetProviderNames stub with SelectHandler signature
- TwoFactorAuthenticationSignIn.razor.cs: Add ProviderSubmit_Click and CodeSubmit_Click handlers
- VerifyPhoneNumber.razor.cs: Add Code_Click handler
- AddPhoneNumber.razor.cs: Add Phone field and PhoneNumber_Click handler
- Fix TextMode string values to use TextBoxMode enum across all Account .razor files
- Fix SelectMethod string references to delegate references for ListView components

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
WingtipToys migration Run 21 results:
- L1: 1.79s, 348 transforms, 0 stubs (all 3 L1 fixes confirmed)
- L2: ~26 min, 44 files modified (431 ins, 560 del)
- Build: 0 errors, 0 WingtipToys warnings
- SelectMethod preserved as delegates on ProductList, ProductDetails, ShoppingCart
- ContentPlaceHolder and GetRouteUrl review items now reference BWFC components

Executive summary updated: 38 runs, 16 perfect scores, SelectMethod milestone added.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Convert AfterContosoUniversity from L1-scaffolded Web Forms stubs to
working Blazor components with EF Core SQLite, BWFC component patterns,
and DI registration.

Changes:
- Models: EF Core with data annotations, ContosoUniversityContext (SQLite)
- BLL: 4 logic classes + StudentViewModel using IDbContextFactory
- Pages: About, Students, Courses, Instructors converted to Blazor partials
- Infrastructure: Program.cs with DI, csproj with Sqlite, _Imports.razor
- Cleanup: deleted EDMX artifacts, empty code-behinds
- Build: 0 errors

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Fixed Program.cs: UseSqlite  UseSqlServer with LocalDB connection
- Removed Microsoft.EntityFrameworkCore.Sqlite package
- Removed EnsureCreated() (existing database)
- Added Run 19 migration report

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Changed EF Core package from Sqlite to SqlServer in csproj template
- Changed Program.cs example from UseSqlite to UseSqlServer with LocalDB
- Prevents agents from defaulting to SQLite during L2 transforms

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… delegates

- Removed 'Prefer SQLite for local dev' from migration-standards (was the root cause of repeated SQLite contamination)
- Added NEVER-default-to-SQLite warnings in migration-standards and bwfc-data-migration
- Made SelectMethod->delegate conversion MANDATORY (not 'alternatively Items=')
- Restricted Items= binding to DataSource-originating patterns only
- Added WARNING admonitions to all three skill files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…vider

- Changed emphasis from 'don''t use SQLite' to 'detect and match the original provider'
- Added L1 Find-DatabaseProvider references so L2 agents know to check detection results
- Aligns with L1 script enhancement that auto-detects from Web.config

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-skill-enforcement-fixes
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 7 decision(s) from inbox into decisions.md (consolidated to 3 blocks)
- Marked 2 superseded decisions (SelectMethod pattern sections 2.2, 6.2)
- Propagated updates to beast, cyclops, rogue, forge history files
- Summarized cyclops history.md (16.3KB to 8.2KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Added Find-DatabaseProvider function that parses Web.config connectionStrings
- Scaffolds the matching EF Core provider package (SqlServer, Sqlite, Npgsql, MySQL)
- Includes detected connection string in Program.cs scaffold comment
- Adds [DatabaseProvider] review item so L2 agents see the detection
- Falls back to SqlServer when no Web.config or connectionStrings found

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-provider-detection
Requested by: Jeffrey T. Fritz

Changes:
- Logged provider detection session (Cyclops Find-DatabaseProvider + Beast skill reframe)
- Merged cyclops-db-provider-detect.md from decisions inbox
- Consolidated 3 overlapping database provider decisions into single entry
- Propagated cross-agent updates to Cyclops and Beast history

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
csharpfritz and others added 5 commits March 11, 2026 17:07
- Rewrote opening: bold stats, mini-table, bullet highlights replace 3 dense paragraphs
- Tightened Drop-In Replacement section (renamed, trimmed)
- Added Run 19 (CU), Run 20/21 (WT) data throughout
- Updated chart script with 3 new data points, regenerated all 3 PNGs
- Total runs: 38 -> 40, new milestones, updated What's Next roadmap

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-11-exec-summary-update
Requested by: Jeffrey T. Fritz

Changes:
- Logged exec summary update session (Beast + Coordinator work on EXECUTIVE-SUMMARY.md)
- Merged 2 inbox decisions into decisions.md
- No deduplication needed (no duplicate headings found)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…iles

The ItemType standardization (renamed TItem/TItemType to ItemType across
all generic data-bound components) was not applied to test files and
sample pages. This caused RZ10001 and CS0411 build errors because the
Razor compiler could not resolve the generic type parameter.

Updated 43 files across:
- RadioButtonList, BulletedList, CheckBoxList, DropDownList, ListBox tests
- ToolTipTests (BaseWebFormsComponent)
- All ControlSamples sample pages
- AfterWingtipToys account pages

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove AfterBlazorClientSide from build.yml (WebAssembly incompatible with HttpContextAccessor)
- Add FrameworkReference to test project to resolve assembly version mismatch

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@csharpfritz csharpfritz merged commit 7e9ff02 into FritzAndFriends:dev Mar 11, 2026
4 checks passed
@csharpfritz csharpfritz deleted the squad/post-implicit-conversions branch March 11, 2026 21:28
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.

1 participant