Skip to content

Release v0.17.0#475

Merged
csharpfritz merged 35 commits intomainfrom
dev
Mar 17, 2026
Merged

Release v0.17.0#475
csharpfritz merged 35 commits intomainfrom
dev

Conversation

@csharpfritz
Copy link
Copy Markdown
Collaborator

What's New in v0.17.0

🚀 New Features

Ajax Control Toolkit Components
Launched the new BlazorAjaxToolkitComponents library with comprehensive ASP.NET Ajax Control Toolkit support (#460). Implemented foundational extenders including ConfirmButtonExtender and FilteredTextBoxExtender (#462), then expanded to a complete library with 14+ additional extenders (#463, #468). These extenders enable drop-in replacements for common client-side behaviors in migrated applications.

Core Components & Handlers
Added FormView and ModelErrorMessage components (#410) to expand form handling capabilities. Introduced HttpHandlerBase for migrating .ashx custom HTTP handlers (#474), enabling a complete migration path for handler-based functionality.

Component Health Dashboard
New component health dashboard provides visibility into component coverage, parity status, and migration readiness (#470).

Component Parity & Base Class Improvements
Enhanced base component classes with critical fixes and feature completions (#428), improving overall component stability and consistency.

🔧 Bug Fixes

🛠️ Migration Toolkit

Comprehensive Migration Pipeline
Established a complete WingtipToys migration pipeline supporting full-stack application migration including EF Core context migration, shopping cart, checkout flows, admin interfaces, and identity systems (#413, #414). Achieved 25/25 passing integration tests with SSR enabled by default (#422).

Enhanced Migration Intelligence
Implemented L1 provider detection and SelectMethod enforcement for data-binding scenarios (#425). Incorporated findings from ContosoUniversity Run 19 and Run 22 analysis into migration script improvements (#426).

Toolkit Enhancements
Extended the 3-skill migration toolkit with integration test coverage and documentation reorganization (#419). Verified migration accuracy through the WingtipToys benchmark run (#416).

📊 Performance & Benchmarks

Performance Benchmark Suite
New comprehensive performance benchmark suite comparing .NET Framework and .NET 10 Blazor implementations (#464). Provides actionable metrics for post-migration optimization decisions.

L3 Post-Migration Optimization Skill
Added L3 post-migration performance optimization skill (#467) to help developers identify and resolve performance bottlenecks in migrated applications.

📝 Documentation


Migration Path: v0.17.0 delivers end-to-end Web Forms to Blazor migration capabilities with validated real-world migration pipelines, expanded component coverage, and performance visibility.

csharpfritz and others added 27 commits March 2, 2026 13:24
…410)

- Fix ListView EditItemTemplate not rendering when EditIndex changes (#406)
- Add TDD tests for ListView EditItemTemplate rendering
- feat(FormView): Add RenderOuterTable parameter
- feat(Validations): Add ModelErrorMessage component with 13 bUnit tests
- docs(ModelErrorMessage): Add docs, sample page, catalog entry
- test(ModelErrorMessage): Add smoke + interactive integration tests
- WingtipToys migration analysis and planning
- AI team session logs and decision merges

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: bump version.json to 0.17 for next dev cycle

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

* Add TDD tests for ListView EditItemTemplate rendering (Issue #406)

Write 6 bUnit tests in EditTemplateTests.razor verifying EditItemTemplate
renders when EditIndex matches item index. 2 pass (negative/null edge cases),
4 fail pre-fix confirming the template swap bug described in Issue #406.

Tests cover: EditIndex parameter rendering, non-matching items still using
ItemTemplate, default EditIndex=-1, HandleCommand edit/cancel template swap,
and EditItemTemplate null fallback.

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

* Fix ListView EditItemTemplate not rendering when EditIndex changes (#406)

The template selection logic and even/odd toggle were inside CascadingValue's
ChildContent, which is a deferred RenderFragment. Variables like dataItemIndex
captured by this closure had their final loop value (item count) instead of the
per-iteration value when the CascadingValue rendered.

Moved template selection and even/odd toggle before the CascadingValue so they
execute during BuildRenderTree when dataItemIndex has the correct value per
iteration. Also updated the CrudEvents test to assert actual template rendering
instead of documenting the gap.

Closes #406

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

* Update Cyclops history and decision inbox for #406 fix

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

* Fix ListView EditItemTemplate not rendering on EditIndex change (#406)

Add @key="dataItemIndex" to CascadingValue elements in ListView.razor's
foreach loops (both non-grouped and grouped paths). Without @key, Blazor's
positional diff did not detect template swaps when EditIndex changed because
the CascadingValue structure looked identical to the diff engine.

Closes #406

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

* docs(ai-team): log M22 planning session, merge decisions

Session: 2026-03-02-m22-planning-release
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-02-m22-planning-release.md
- Merged Forge M22 planning decision from inbox
- Merged Cyclops ListView EditItemTemplate fix decision from inbox
- Merged Rogue ListView EditTemplate TDD tests decision from inbox
- Propagated M22 planning updates to agent histories

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

* docs(ai-team): summarize oversized agent histories

Session: 2026-03-02-m22-planning-release
Requested by: Jeffrey T. Fritz

Changes:
- Summarized forge history.md (17KB > 10KB): M17 gate review through Themes roadmap
- Summarized cyclops history.md (17KB > 12KB): M20 theming and release process
- Summarized rogue history.md (13KB > 10KB): M20 theming and FontInfo tests

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

* Added WingtipToys

* docs(ai-team): WingtipToys migration analysis session

Session: 2026-03-02-wingtiptoys-migration-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-02-wingtiptoys-migration-analysis.md
- Merged Forge's migration plan from inbox into decisions.md
- Propagated team update to agent history files

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

* docs(ai-team): merge squad WingtipToys defaults from inbox

Session: 2026-03-02-wingtiptoys-migration-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Merged squad-wingtiptoys-defaults.md from inbox into decisions.md
- Deleted processed inbox file

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

* feat(FormView): Add RenderOuterTable parameter

When RenderOuterTable=false, FormView renders template content directly
without the wrapping <table> element, matching Web Forms behavior.
Default is true for backward compatibility.

Includes 8 new bUnit tests covering default, explicit true/false,
empty data, edit mode, and structural equivalence scenarios.

Closes the only blocking component gap for WingtipToys migration.

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

* docs(ai-team): FormView fix, migration strategy, project reframe

Session: 2026-03-02-formview-migration-strategy
Requested by: Jeffrey T. Fritz

Changes:
- Logged session: FormView RenderOuterTable fix + migration tooling strategy
- Merged 3 decisions: user directive (migration tool focus), FormView RenderOuterTable impl, ASPX migration tooling strategy
- Propagated team updates to affected agents

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

* feat(Validations): Add ModelErrorMessage component

Add ModelErrorMessage component to close the last BWFC control gap.
Matches ASP.NET Web Forms <asp:ModelErrorMessage> for zero-markup migration.

- Inherits BaseStyledComponent (display-only, not a validator)
- Reads errors from EditContext via string-keyed ModelStateKey
- Renders <span> with error text when errors exist, nothing when clean
- Supports CssClass, SetFocusOnError, AssociatedControlID
- Strips BWFC validator metadata (\x1F encoding) from messages
- HTML-encodes error messages for XSS safety
- Multiple errors joined with <br> in single <span>
- Added bwfc.Validation.SetFocus JS function to Basepage.js
- 13 bUnit tests covering all edge cases (1464/1464 total passing)

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

* docs(ModelErrorMessage): Add docs, sample page, catalog entry

- Created docs/ValidationControls/ModelErrorMessage.md with full docs
- Created ModelErrorMessageSample.razor with EditForm demo
- Added ComponentCatalog.cs entry in Validation section
- Updated status.md: Validation Controls 7->8, TOTAL 51->52
- Updated mkdocs.yml nav with ModelErrorMessage page

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

* docs(ai-team): M21 wrap-up session log, merge decisions

Session: 2026-03-02-m21-wrapup
Requested by: Jeffrey T. Fritz

Changes:
- Logged M21 wrap-up session (ModelErrorMessage component, docs, samples, tests)
- Merged 2 decision inbox files (Beast docs, Forge spec) into decisions.md
- Deduplicated decisions.md (5 exact dupes removed, 3 ModelErrorMessage blocks consolidated)
- Propagated ModelErrorMessage decisions to Cyclops, Rogue, Beast, Jubilee, Forge histories

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

* test(ModelErrorMessage): Add smoke + interactive integration tests

- Added InlineData smoke test in ControlSampleTests.cs
- Added 3 Playwright interactive tests in InteractiveComponentTests.cs:
  - Submit empty form shows error spans
  - Valid submit shows no errors
  - Clear button removes errors
- Uses WaitForSelectorAsync pattern for CI stability

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

* docs(ai-team): merge Colossus integration test decision

Session: 2026-03-02-m21-wrapup
Requested by: Jeffrey T. Fritz

Changes:
- Merged Colossus integration test decision from inbox

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

* feat(migration): Add three-layer migration pipeline tooling

- Add webforms-migration Copilot skill with complete transformation rules
- Add bwfc-scan.ps1 project scanner (inventory + readiness scoring)
- Add bwfc-migrate.ps1 mechanical transform script (~40% automation)
- Add migration.agent.md interactive migration agent definition
- Add AutomatedMigration.md MkDocs guide for the pipeline
- Update mkdocs.yml navigation

Three-layer pipeline: Script (40%) -> Skill (45%) -> Agent (15%)
Verified: WingtipToys scans at 100% readiness, 230/230 controls covered

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

* docs(ai-team): merge PR target directive

Session: 2026-03-02-m22-migration-tooling
Requested by: Jeffrey T. Fritz

Changes:
- Merged PR target directive from inbox

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

* docs(ai-team): WingtipToys migration analysis session

Session: 2026-03-02-wingtiptoys-migration-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Updated session log with PR #413, Layer 1-3 effectiveness metrics
- Merged forge-wingtiptoys-migration-analysis.md from decisions inbox
- Propagated cross-agent updates to Forge, Cyclops, Rogue
- Summarized Forge history (21KB -> 8KB), Cyclops (15KB -> 11KB), Rogue (12KB -> 9KB)

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

* docs(ai-team): log executive report and screenshot session

Session: 2026-03-02-executive-report-screenshots
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-02-executive-report-screenshots.md
- No inbox decisions to merge (inbox empty)

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

* Make AfterWingtipToys Blazor sample site buildable and renderable

Convert the Layer 1 migration output of WingtipToys into a working Blazor
site for screenshot demos. Key changes:

- Create Blazor infrastructure: App.razor, Routes.razor, _Imports.razor,
  MainLayout.razor with Bootstrap 3 navbar and category menu
- Create model classes: Product, Category, CartItem
- Stub all code-behind files with ComponentBase (replacing System.Web types)
- Add sample data to Default, ProductList, ShoppingCart, ProductDetails pages
- Fix razor markup: replace Web Forms expressions with Blazor syntax
- Simplify Account, Checkout, Admin pages to remove invalid references
- Remove Site.Mobile.razor and ViewSwitcher.razor (not needed for demo)
- Copy WingtipToys logo to wwwroot/Images
- Build succeeds with 0 errors, 0 warnings

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

* fix: sync cart data, fix connection strings, add product images

- Update AfterWingtipToys ShoppingCart with real product data matching original
- Update WingtipToys Web.config LocalDB connection string: v11.0 -> MSSQLLocalDB
- Add Directory.Build.props to block NBGV inheritance in WingtipToys
- Add product images to AfterWingtipToys wwwroot
- Update ProductList with proper data binding

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

* docs: add executive report with real side-by-side screenshots

Both original Web Forms (IIS Express :5200) and migrated Blazor (Kestrel :5201)
running simultaneously. Screenshots show Home, Products, and Shopping Cart
comparisons from live applications.

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

* docs: add actual migration timeline appendix to executive report

Adds footnote on estimated effort and detailed appendix showing real
Squad + BWFC timing: 4.5 hours wall clock for 33 files (analysis through
running site), with 5 agents working in parallel.

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

* fix: resolve 7 CSS/visual differences between original and migrated WingtipToys

- Switch from CDN Bootstrap to local Bootswatch Cerulean theme (navbar color fix)
- Restore GroupItemCount=4, GroupTemplate, LayoutTemplate to ProductList (4-column grid)
- Fix BoundField.DataFormatString bug: pass obj directly instead of obj.ToString()
- Add missing Trucks category (5 categories matching original)
- Update to all 16 products with correct CategoryIDs from original seeder
- Copy Site.css + Cerulean CSS to wwwroot/Content/ for static file serving
- Add CSS fidelity analysis section to executive report

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

* chore: update screenshots after CSS fidelity fixes

Fresh Playwright screenshots showing:
- Blue Cerulean navbar (was dark gray)
- 4-column product grid with 16 products (was single column, 8 products)
- Dollar sign currency formatting on cart prices (was missing)
- Updated side-by-side comparison PNGs

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

* docs(ai-team): CSS fixes session log and decision merge

Session: 2026-03-03-css-fixes-screenshots
Requested by: Jeff Fritz

Changes:
- Logged session to .ai-team/log/2026-03-03-css-fixes-screenshots.md
- Merged 2 decisions from inbox into decisions.md (Cyclops WingtipToys build config, Forge CSS fidelity)
- Propagated cross-agent updates to Cyclops and Forge history
- Summarized Cyclops history.md (14.2KB -> 9.7KB)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…in, Identity (#414)

* chore: bump version.json to 0.17 for next dev cycle

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

* feat(wingtiptoys): add EF Core data foundation, models, and CartStateService

- Add ProductContext with SQLite, seed 16 products + 5 categories
- Add Order/OrderDetail models
- Add CartStateService (scoped DI, replaces Session state)
- Register all services in Program.cs

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

* feat(wingtiptoys): wire product browsing, shopping cart, and error page

- ProductList: EF Core data binding with category filter
- ProductDetails: data-bound product display
- MainLayout: dynamic category navigation
- AddToCart: CartStateService integration + redirect
- ShoppingCart: GridView data binding with update/remove
- ErrorPage: error display wiring

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

* feat(wingtiptoys): implement checkout flow with mock PayPal

- Add CheckoutStateService for checkout state management
- Add MockPayPalService (IPayPalService interface)
- Wire CheckoutStart: order creation + PayPal redirect
- Wire CheckoutReview: order display + payment completion
- Wire CheckoutComplete: transaction confirmation

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

* fix(wingtiptoys): add CartItem primary key configuration

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

* docs: update executive report with v2 metrics and screenshots

- Update to reflect fully functional migration (31/33 pages working)
- Add 6 new screenshots (home, products, details, cart, login, category filter)
- Update metrics: ~11 hours actual, 16 BWFC components, EF Core + Identity
- Add Phase 2 timeline (data foundation, browsing, cart, admin, auth, checkout)
- Update remaining work table (most items now complete)

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

* docs(ai-team): log M22 feature completion session, merge 4 decisions

Session: 2026-03-03-milestone22-feature-completion
Requested by: Jeff Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 4 decision(s) from inbox into decisions.md
- Propagated updates to agent history files
- Summarized oversized history files (Cyclops, Forge, Rogue)
- Consolidated overlapping ListView OrderedDictionary decision

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

* docs: restore side-by-side comparison screenshots in executive report

Replace individual Blazor-only screenshots with paired Web Forms (left) vs
Blazor (right) comparison images for home, products, and cart pages. Keep
additional migrated pages (details, cars filter, login) in a supplementary
table section.

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

* docs: fix side-by-side comparison screenshots with matched zoom and data

All comparisons now use identical 1280x900 viewport screenshots.
Cart comparison shows same 3 items on both sides (.40 total).
Updated executive report cart description.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: bump version.json to 0.17 for next dev cycle

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

* feat(listview): implement 16 CRUD events (#356)

Fix two Web Forms lifecycle deviations:
- ItemCreated: changed from EventCallback firing once on first render to
  EventCallback<ListViewItemEventArgs> firing per-item before ItemDataBound
- ItemCommand: now fires for ALL commands before routing to specific handlers,
  matching Web Forms behavior where ItemCommand always fires first

All 16 events verified: ItemInserting/Inserted, ItemUpdating/Updated,
ItemDeleting/Deleted, ItemEditing, ItemCanceling, Sorting/Sorted,
PagePropertiesChanging/Changed, LayoutCreated, SelectedIndexChanging/Changed,
ItemCreated, DataBound. All 43 ListView tests pass.

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

* docs: add migration toolkit (6 priority documents)

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

* docs(ai-team): log ListView/toolkit session

Session: 2026-03-03-listview-crud-and-toolkit
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-03-listview-crud-and-toolkit.md
- Decisions already merged from inbox (prior session)
- Cross-agent updates already propagated (prior session)

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

* feat: add distributable BWFC migration skill for Copilot

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

* docs: update Beast history and add decision record for bwfc-migration skill

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

* feat: split migration skill into 3 focused skills

Refactor the monolithic bwfc-migration skill (852 lines) into three
focused skills optimized for Copilot context efficiency:

- bwfc-migration (436 lines): Core markup migration  controls,
  expressions, directives, code-behind, layouts. Used per-page.
- bwfc-identity-migration (270 lines): ASP.NET Identity/Membership
  to Blazor Identity. One-time architectural concern.
- bwfc-data-migration (381 lines): EF6 to EF Core, DataSource to
  services, Session to scoped services, architecture decisions.

Each skill cross-references the others in its description and body.
Skills are designed to be portable  drop into any project's
.github/skills/ folder to enable Web Forms migration with BWFC.

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

* docs(ai-team): log ListView/toolkit session and merge decisions

Session: 2026-03-03-listview-crud-and-toolkit
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged decision inbox files into decisions.md
- Consolidated overlapping migration toolkit delivery format decisions

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

* refactor: move distributable skills and scripts into migration-toolkit/

Per Jeff's directive: distributable migration assets belong in
migration-toolkit/, not .github/skills/. Internal project skills
remain in .github/skills/.

- Moved 3 BWFC migration skills to migration-toolkit/skills/
- Copied 2 PowerShell scripts to migration-toolkit/scripts/
- Updated migration-toolkit/README.md with new structure

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

* docs: update Forge history and decision record for toolkit restructure

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: fix component count and internal references in toolkit

- Updated component count from 52 to 58 across 6 categories (not 7)
- Added Chart, ImageMap, and Substitution to Editor Controls coverage table
- Replaced all internal repo references (../.github/skills/, ../.github/agents/)
  with distributed toolkit paths (skills/bwfc-migration/, skills/bwfc-data-migration/)
- Fixed wrong org name (AzimoLabs -> FritzAndFriends) in URLs
- Toolkit docs now accurate for external distribution

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

* docs: create migration test run structure and template

Establishes docs/migration-tests/ as the standard location for
migration benchmark reports with per-run subfolders.

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

* benchmark: Layer 1 scan and migrate for WingtipToys

Ran bwfc-scan.ps1 and bwfc-migrate.ps1 against original WingtipToys
Web Forms source. Captured timing and output for benchmark report.

Scan: 0.9s, 32 files, 230 controls, 100% BWFC coverage
Migrate: 2.4s, 276 transforms, 33 razor files + 32 code-behind
Build: 338 errors (expected - code-behind needs Layer 2)

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

* benchmark: Layer 2+3 migration for WingtipToys

Completed structural and architectural migration of FreshWingtipToys
using BWFC migration skills. Captured timing for each phase.

- Phase 1 (Data infrastructure): 121s - models, services, EF Core, DI
- Phase 2 (Core storefront): 136s - 8 pages migrated
- Phase 3 (Checkout + Admin): 187s - 6 pages migrated
- Phase 4 (Layout): 20s - MainLayout, App, Routes
- Phase 5 (Build fix): 99s - 3 rounds to clean build
- Total: ~563s (~9.4 min) for Layer 2+3
- Build result: 0 errors, 0 warnings

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

* docs: update Cyclops history and decision doc for Layer 2+3 benchmark

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

* benchmark: verification screenshots and runtime fixes

- Move static assets to wwwroot/ for proper Blazor static file serving
- Copy product images from Catalog/Images to wwwroot/Images/Products/
- Fix CartStateService to use cookie-based cart ID (persists across circuits)
- Add 6 verification screenshots: homepage, products, details, cart, category, login
- Update benchmark report with full Layer 1-3 details, architecture table, screenshots

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

* docs: correct benchmark report verification accuracy

Update report to distinguish page-load verification from functional testing.
Add Known Issues section for cart, login, and register interactive features.

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

* Fix shopping cart, login, and register in FreshWingtipToys

Issue 1 - Shopping Cart: TextBox component was missing @onchange handler,
so TextChanged/OnTextChanged callbacks never fired. Added HandleChange
method to TextBox.razor.cs that updates Text, triggers validation, and
invokes both TextChanged and OnTextChanged callbacks. Wired @onchange
to both <input> and <textarea> elements in TextBox.razor.

Issue 2 - Login: SignInManager.PasswordSignInAsync cannot set cookies
from a SignalR circuit (InteractiveServer mode). Replaced direct
SignInManager call with navigation to a minimal API endpoint
(/Account/PerformLogin) that runs in HTTP context where cookies work.

Issue 3 - Register: Same SignalR cookie limitation. UserManager.CreateAsync
works fine in SignalR (no cookies), but SignInManager.SignInAsync does not.
After user creation, redirect to /Account/PerformRegisterSignIn endpoint
that validates credentials and sets the auth cookie via HTTP.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#417)

- Remove leftover LogError debug spam from UiStyle.cs that caused false
  console errors in Playwright tests
- Add side-by-side visual comparison screenshots to benchmark report
- Update migration tests README status to Complete

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: await async OnClick handlers and prevent TextBox value loss

ButtonBaseComponent.Click() was void and didn't await InvokeAsync(),
causing async OnClick/OnCommand handlers to fire-and-forget. Exceptions
were silently swallowed and StateHasChanged never ran after completion.
This broke Shopping Cart update, Login, and Register in Blazor Server.

TextBox used only @onchange (blur-triggered), so when one field's
TextChanged callback triggered a re-render, downstream fields had their
typed values overwritten by the server-side empty state. Added @oninput
handler for internal Text sync while preserving @onchange for TextChanged
(Web Forms blur-triggered semantics).

Also fixed ImageButton to use EventCallback instead of Action for the
onclick handler, ensuring async Click() is properly awaited.

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

* fix: static assets, logout endpoint, and migration tooling updates

- Program.cs: UseStaticFiles() -> MapStaticAssets() for _framework/blazor.web.js
- Program.cs: Add /Account/PerformLogout POST endpoint for SignInManager
- MainLayout.razor: Logout form targets /Account/PerformLogout with data-enhance=false
- Add Properties/launchSettings.json for Development environment
- bwfc-migrate.ps1: Generate MapStaticAssets() + launchSettings.json in scaffold
- SKILL.md: Add static assets, launchSettings, and Identity auth migration guidance

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

* docs: WingtipToys migration benchmark Run 2  11/11 features PASS

Full migration benchmark with updated tooling:
- Layer 1 scan+migrate: 5.6s (32 files, 277 transforms)
- Build: 7.3s (0 errors)
- 11/11 features verified with Playwright
- 6 page screenshots captured
- Executive summary report with timing and comparisons

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

* docs(ai-team): Log migration Run 2 session, merge decisions

Session: 2026-03-04-migration-run2
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-migration-run2.md
- Merged 7 decisions from inbox into decisions.md
- Consolidated overlapping toolkit decisions (346+350)
- Propagated cross-agent updates to all 6 agent history files
- Summarized Beast, Cyclops, Forge history.md (exceeded 12KB)

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

* docs: WingtipToys full from-scratch migration regression Run 3

Complete from-scratch migration regression of WingtipToys (32 files,
230 controls) using the BWFC migration toolkit. Unlike Run 2 which
copied Layer 2 from FreshWingtipToys, Run 3 writes all models,
services, layout, identity pages, and storefront pages from scratch
based on original Web Forms source.

Results: 11/11 features PASS (identical to Run 2)
- Home page, product categories, product list, product details
- Add to cart, shopping cart (view/update/remove)
- Register, login, logout

Build: 0 errors, 63 warnings (all in BWFC library)
Layer 1 (automated): 3.7s scan+migrate
Layer 3 (build): 11.9s

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

* docs(ai-team): Log migration Run 3 session

Session: 2026-03-04-migration-run3
Requested by: Jeffrey T. Fritz

* docs: correct unconverted patterns  DataBinder/Eval already supported

Run 2 and Run 3 reports incorrectly listed Eval with format strings as
unconverted patterns requiring Layer 2. BWFC's DataBinder.Eval fully
supports format strings, and the migration script already converts
single-arg Eval. Updated both reports to distinguish:
- Patterns already covered by BWFC (Eval with/without format strings)
- Patterns that truly need Layer 2 (String.Format, GetRouteUrl, code blocks)

Added decision proposal for enhancing bwfc-migrate.ps1 with two
additional regex transforms for format-string Eval and simple
String.Format patterns.

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

* docs(ai-team): Log DataBinder correction, merge Eval regex decision

Session: 2026-03-04-databinder-correction
Requested by: Jeffrey T. Fritz

Changes:
- Logged DataBinder correction session
- Merged eval-regex-enhancement decision from inbox
- Propagated decision update to Cyclops history
- No duplicates found in decisions.md

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

* feat: enhance bwfc-migrate.ps1 with master page transforms and Eval regexes

Add ConvertFrom-MasterPage function that handles .master-specific transforms:
- Inject @inherits LayoutComponentBase
- Strip document wrapper (DOCTYPE, html, head, body)
- Extract head metadata into HeadContent block
- Remove ScriptManager block entirely
- Replace ContentPlaceHolder MainContent with @Body
- Remap output path to Components/Layout/MainLayout.razor
- Flag LoginView and SelectMethod for Layer 2 attention

Add New-AppRazorScaffold function generating App.razor and Routes.razor.

Add two new expression regexes in ConvertFrom-Expressions:
- Eval with format string: Eval("prop", "{0:C}") -> @context.prop.ToString("C")
- String.Format with Item: String.Format("{0:c}", Item.Prop) -> interpolated

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

* docs(ai-team): Log master page script session, merge decisions

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

* docs: WingtipToys migration Run 4 with master page + Eval enhancements

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

* chore: update Forge history and decisions with Run 4 results

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

* docs(ai-team): Log migration Run 4 session, merge decisions

Session: 2026-03-04-migration-run4
Requested by: Jeffrey T. Fritz

Changes:
- Logged Forge migration Run 4 (289 transforms, 0 errors, 11/11 PASS)
- Merged inbox decision: forge-run4-results.md into decisions.md

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

* docs: fix Run 4 report image links and enhance executive summary

- Fix Original Web Forms screenshot paths (../../ -> ../../../) to correctly
  resolve from docs/migration-tests/wingtiptoys-run4-2026-03-04/ to repo root
- Enhance Section 1 executive summary with run-time metrics (~3s script,
  12.32s build), success metrics (289 transforms, 0 errors, 11/11 pass),
  Run 3 comparisons, and quick-reference metrics table

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

* fix: complete GetRouteUrl RouteValueDictionary overloads

The two RouteValueDictionary overloads were stubbed (returning null).
Now delegate to LinkGenerator.GetPathByRouteValues like the
object overloads.

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

* docs(ai-team): log GetRouteUrl completion and report fixes session

Session: 2026-03-04-getrouteurl-and-report-fixes
Requested by: Jeff Fritz

Changes:
- logged session to .ai-team/log/2026-03-04-getrouteurl-and-report-fixes.md
- merged 2 decision(s) from inbox into decisions.md
- propagated updates to affected agent history files (beast, cyclops, forge, colossus)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ganization (#419)

* Organize planning-docs into subdirectories

Move 75 files into categorized subdirectories while preserving git history:
- components/  53 per-component analysis docs
- milestones/  11 milestone plans, audits, and post-fix reports
- analysis/  9 cross-cutting analysis docs
- reports/  1 executive report

Update README.md to serve as index/table of contents for the new structure.

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

* feat: migration script enhancements + integration test gaps

Script enhancements (bwfc-migrate.ps1):
- ConvertFrom-LoginView: auto-converts LoginView to AuthorizeView
  (AnonymousTemplateNotAuthorized, LoggedInTemplateAuthorized)
- ConvertFrom-GetRouteUrl: converts Page.GetRouteUrl calls to
  BWFC GetRouteUrlHelper pattern with Evalcontext translation
- ConvertFrom-SelectMethod: strips SelectMethod attributes and
  inserts TODO-annotated DI service injection guidance

Integration tests (6 new entries):
- CheckBoxList, DataPager, ImageButton, ListBox, LoginView, Theming
  added to ControlSampleTests.cs with matching interactive tests

Housekeeping:
- .gitignore: exclude samples/FreshWingtipToys/ and feasibility doc
- Capture directive about excluded scratch artifacts

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

* docs(ai-team): capture PR target directive

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

* docs(ai-team): session log and inbox merge for 2026-03-04 milestone work

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

* feat: script easy wins  bare Item binding, Register cleanup, uc: prefix

- Add bare <%#: Item %>  @context regex (fixes 3 OpenAuthProviders items)
- Improve Register directive messaging (less alarming flagging)
- Strip uc:/uc1:/uc2: tag prefixes alongside asp: (fixes 1 item)

Combined with PR #419's LoginView/GetRouteUrl/SelectMethod, this reduces
WingtipToys Run 4 manual items from 18  ~10 (44% reduction).

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

* docs(ai-team): session log and decision merge for Run 5 migration

Session: 2026-03-04-run5-migration
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 5 migration session (309 transforms, clean build)
- Merged decisions from inbox (Cyclops run5-migration, Beast run5-report)
- Propagated cross-agent updates to Cyclops and Beast
- Summarized oversized Cyclops and Forge history.md entries

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

* Run 5 WingtipToys migration benchmark with enhanced toolkit

- Fresh WingtipToys migration: 3.25s script (309 transforms, 32 files) + clean build (0 errors, 4.56s)
- Comprehensive 9-section benchmark report with Run 4 vs Run 5 comparison
- BWFC capability analysis: 95+ EventCallbacks, component coverage assessment
- Migration standards skill: .NET 10 target, EF Core, ASP.NET Core Identity, event handler mapping
- Synced migration-toolkit/ as canonical home: enhanced script (47KB, 1164 lines), skills, README
- Updated AfterWingtipToys sample with fresh migration output (~80 files)

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

* docs(ai-team): migration standards directives and session log

Session: 2026-03-04-migration-standards
Requested by: Jeffrey T. Fritz

Changes:
- Logged migration standards session
- Merged migration standards and toolkit canonical directives
- Merged Forge Run 5 analysis decisions
- Consolidated toolkit canonical decision with earlier restructure
- Propagated cross-agent updates to Forge, Cyclops, Beast
- Summarized Forge and Cyclops histories (both over 12KB)

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

* docs(ai-team): Run 6 improvement analysis session

Session: 2026-03-04-run6-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-run6-analysis.md
- Merged Forge's Run 6 improvement decisions from inbox
- Consolidated overlapping BWFC migration standards + Run 6 enhancements
- Propagated updates to affected agent history files (cyclops, beast, rogue, forge)
- Archived Forge history entries older than 2 weeks to history-archive.md

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

* feat(migration): implement Run 6 top-4 script enhancements

1. Scaffold TFM: net8.0  net10.0, _Imports.razor adds RenderMode using + @rendermode InteractiveServer
2. SelectMethod TODO: BWFC-aware guidance (use Items parameter, OnInitializedAsync)
3. Static files: copy to wwwroot/ subdirectory instead of project root
4. Compilable stubs: detect Identity/Auth/Payment pages and emit @page/@code stubs

Saves ~205s of manual fix time per migration run.

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

* docs(ai-team): Run 6 script implementation session

Session: 2026-03-04-run6-implementation
Requested by: Jeffrey T. Fritz

Changes:
- Logged Cyclops implementation session
- Merged Cyclops script enhancement decisions from inbox

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

* docs(ai-team): Run 6 benchmark session

Session: 2026-03-04-run6-benchmark
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 6 migration benchmark session
- Merged Forge Run 6 benchmark decisions from inbox
- Propagated updates to affected agent histories
- Summarized Forge and Cyclops histories (exceeded ~12KB)

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

* Run 6 WingtipToys migration benchmark  55% time reduction

Layer 1 (script): 4.58s, 269 transforms, 79 static files to wwwroot/
Layer 2 (manual): ~3 min 25s  EF Core models, services, page wiring
Total: ~4 min 30s (down from ~10 min in Run 5)

All 4 enhancements validated:
- net10.0 TFM scaffolding (eliminated build fix round)
- BWFC-aware SelectMethod TODO (highest impact  preserved data controls)
- wwwroot static file pathing (eliminated manual asset relocation)
- Compilable stub auto-generation (6 pages auto-stubbed)

2 script bugs found:
- @rendermode in _Imports.razor invalid in .NET 10
- Stub detection misses code-behind-only Identity references

Final build: 0 errors, 0 warnings on net10.0

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

* docs: correct @rendermode placement in migration skills and standards

Document that @rendermode is a directive attribute on component instances
(Routes, HeadOutlet in App.razor), not a standalone directive in _Imports.razor.

- migration-standards/SKILL.md: new Render Mode Placement subsection
- bwfc-migration/SKILL.md: Step 2 adds @using static, new Step 2b for App.razor
- METHODOLOGY.md: scaffold table includes App.razor
- beast/history.md: append render mode correction learnings

Reference: https://learn.microsoft.com/aspnet/core/blazor/components/render-modes

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

* fix: remove invalid @rendermode InteractiveServer from _Imports.razor scaffold

The @rendermode directive attribute cannot be used as a standalone directive
in _Imports.razor. Removed it from both migration-toolkit and scripts copies
of bwfc-migrate.ps1. The @using static import and App.razor @rendermode
attributes were already correct.

Closes the Run 6 benchmark build errors (8 errors from invalid directive).

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

* docs(ai-team): capture @rendermode placement directive

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

* docs(ai-team): rendermode fix session log and decisions merge

Session: 2026-03-04-rendermode-fix
Requested by: Jeffrey T. Fritz

Changes:
- Logged rendermode fix session
- Merged decision inbox (Cyclops rendermode fix, Copilot directive)
- Deduplicated decisions.md (consolidated 3 overlapping rendermode decisions)
- Propagated cross-agent updates to cyclops, beast, forge history.md

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

* fix: pin EF Core to 10.0.3 and update migration skills

- Pin AfterWingtipToys to Microsoft.EntityFrameworkCore 10.0.3 (was preview.*)
- Update migration-standards skill with EF Core version requirement
- Update bwfc-data-migration skill with EF Core 10.0.3 reference
- Add directive to decisions inbox

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

* docs(ai-team): EF Core version directive session

Session: 2026-03-04-efcore-version
Requested by: Jeffrey T. Fritz

Changes:
- Logged EF Core version directive session
- Merged EF Core directive from inbox into decisions.md
- Propagated update to agent history files

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

* feat: add WebFormsPageBase for zero-change Page.Title migration

Introduces WebFormsPageBase : ComponentBase that provides:
- Title, MetaDescription, MetaKeywords (delegate to IPageService)
- IsPostBack => false (if (!IsPostBack) compiles unchanged)
- Page => this (Page.Title = "X" works as-is from Web Forms)

Converted pages use @inherits WebFormsPageBase in _Imports.razor.
Eliminates per-page @Inject IPageService and IsPostBack rewrites.

Includes 8 bUnit tests (1472 total, 0 failures).
Updates migration toolkit skills and methodology docs.

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

* docs(ai-team): WebFormsPageBase session log and decisions

Session: 2026-03-04-webformspagebase
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-webformspagebase.md
- Merged decision files from inbox into decisions.md
- Propagated updates to agent history files

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

* feat: consolidate WebFormsPage with IPageService head rendering

WebFormsPage now provides NamingContainer + ThemeProvider + page head
rendering (<PageTitle> + <meta> tags) in a single layout component.
Developers only need two setup lines:
  1. @inherits WebFormsPageBase (in _Imports.razor)
  2. <WebFormsPage> wrapping @Body (in layout)

- Added IPageService subscription to WebFormsPage.razor.cs
- Added <PageTitle> and <HeadContent> rendering to WebFormsPage.razor
- Added RenderPageHead parameter (default: true) for opt-out
- 7 new bUnit tests (1479 total, 0 failures)
- Updated Page System documentation with new architecture diagram
- Page.razor kept as standalone fallback for non-WebFormsPage layouts

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

* docs(ai-team): log WebFormsPage consolidation session

Session: 2026-03-04-webformspage-consolidation
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 2 decisions from inbox into decisions.md (forge-page-consolidation, cyclops-webformspage-consolidation)
- Consolidated into single decision block: WebFormsPage IPageService head rendering consolidation
- Propagated updates to cyclops, forge, rogue, beast history files

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

* feat: wire WebFormsPageBase into sample app

- Add @inherits WebFormsPageBase to Pages/_Imports.razor
- Wrap @Body with <WebFormsPage> in MainLayout.razor
- All 217 integration tests pass, all 1479 bUnit tests pass

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs(ai-team): CRITICAL branching workflow directives

Session: 2026-03-06-branching-workflow-directive
Requested by: Jeff Fritz

Changes:
- Logged branching workflow directive session
- Merged 2 critical directives from inbox into decisions.md
- Consolidated into single branching workflow decision
- Propagated to all 6 active agent history files (psylocke/bishop have no history.md)

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

* docs(ai-team): BWFC audit and skills review session

Session: 2026-03-06-bwfc-audit-skills-review
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-bwfc-audit-skills-review.md
- Merged 2 decisions from inbox into decisions.md (Forge audit, Beast skills review)
- Propagated cross-agent updates to 6 agent history files
- No duplicate decisions found (370 blocks, all unique headings)

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

* docs: BWFC library audit + migration skills cross-reference

- Audited all 153 Razor components + 197 C# classes in BWFC library
- Updated CONTROL-COVERAGE.md: added 95 undocumented components across
  4 new sections (Infrastructure, Field Columns, Style Sub-Components,
  Utilities), fixed ContentPlaceHolder listed as Not Supported
- Fixed 16+ issues across 7 skill/doc files: stale LoginView->AuthorizeView
  guidance, wrong base class, incorrect IsPostBack/Page.Title mappings
- Added missing BWFC features to bwfc-migration skill: MasterPage, Content,
  DataBinder.Eval, NamingContainer, Theming, Custom Controls
- Updated QUICKSTART.md SDK version, _Imports.razor, layout guidance
- Wrote audit report: dev-docs/bwfc-audit-2026-03-06.md
- Wrote skills review: dev-docs/skills-review-2026-03-06.md

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

* Layer 2 migration: WingtipToys Web Forms to Blazor

- Add Models (Category, Product, CartItem) with EF Core
- Add ProductContext (IdentityDbContext) with SQLite
- Add ProductDatabaseInitializer with full seed data
- Add ShoppingCartService for cart operations
- Configure Program.cs with Identity, Session, EF Core
- Fix MainLayout with navigation links and AuthorizeView
- Convert all page code-behinds to Blazor components
- Convert Account/Login and Account/Register to ASP.NET Core Identity
- Replace broken Web Forms patterns with Blazor equivalents
- Stub remaining account/admin pages for compilation
- Remove ViewSwitcher and MobileLayout (not needed)

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

* Run 8: WingtipToys migration  14/14 acceptance tests pass

- Layer 1 script: 269 transforms, 32 files, 2.5s
- Layer 2 manual: EF Core models, Identity, services, 2 build iterations
- Phase 3: 4 test rounds to resolve HTTP session + Interactive Server incompatibility
- Auth pages use HTML form POST to minimal API endpoints
- Cart operations use form POST to minimal API endpoints
- AddToCart uses onclick JS workaround for Blazor enhanced nav
- Includes comprehensive migration report in dev-docs/

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

* docs: Run 8 report  add timing, screenshots, before/after comparisons

- Migration timeline with ASCII diagram and phase breakdown
- 9 screenshots showing functional Blazor app (homepage, products, cart, auth)
- Before/after code comparisons for 4 key pages (Default, MasterPage, ProductList, Login)
- Updated executive summary with total wall-clock time (1h 55min)

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

* docs(ai-team): Run 8 report update session log

Session: 2026-03-06-run8-report-update
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-run8-report-update.md
- Merged 2 decisions from inbox into decisions.md (beast-run8-report-update, copilot-directive-doc-scope)
- Deduplicated decisions.md (0 exact duplicates found)
- Propagated doc-scope directive to beast, jubilee, forge
- Propagated report-format pattern to forge

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

* docs(ai-team): Summarize oversize agent history files

Session: 2026-03-06-run8-report-update
Requested by: Jeffrey T. Fritz

Changes:
- Summarized beast history.md: 19KB -> 9KB (7 blocks archived)
- Summarized forge history.md: 18KB -> 11KB (5 blocks archived)
- Summarized cyclops history.md: 17KB -> 6KB (5 blocks archived)
- Summarized rogue history.md: 13KB -> 8KB (3 blocks archived)
- Older entries moved to history-archive.md for each agent

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

* fix: LoginView migration preserves BWFC component instead of AuthorizeView

ConvertFrom-LoginView now converts <asp:LoginView> to <LoginView> (BWFC)
instead of <AuthorizeView>. AnonymousTemplate and LoggedInTemplate are
left as-is since they are already the correct BWFC parameter names.

Updated AfterWingtipToys MainLayout to use BWFC LoginView + LoginName.

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

* docs(ai-team): LoginView fix session log and decision merge

Session: 2026-03-06-loginview-fix
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-loginview-fix.md
- Merged directive + Cyclops decision from inbox into decisions.md
- Consolidated overlapping LoginView decisions into single block
- Propagated LoginView directive to all agent histories

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

* docs: implement 6 skill documentation fixes from Run 8 post-mortem (RF-01/02/05/09/13/14)

- RF-01 (P0): Add Interactive Server mode warnings for cookie auth and session state
- RF-02 (P0): Add copy-paste minimal API endpoint templates for login/register/logout
- RF-05 (P1): Add prominent LoginView preservation warning (never convert to AuthorizeView)
- RF-09 (P1): Document Blazor enhanced navigation breaking links to API endpoints
- RF-13 (P1): Add ListView GroupItemCount migration example with LayoutTemplate/GroupTemplate
- RF-14 (P1): Document DisableAntiforgery() requirement for all Blazor form POST endpoints

Files updated:
- migration-toolkit/skills/bwfc-identity-migration/SKILL.md
- migration-toolkit/skills/bwfc-data-migration/SKILL.md
- migration-toolkit/skills/migration-standards/SKILL.md
- migration-toolkit/skills/bwfc-migration/SKILL.md

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

* feat(migration): implement 15 Run 9 improvements (P0+P1)

Script fixes (Cyclops - 9 items):
- RF-03: Auto-copy Models directory with EF6 using stripping
- RF-04: DbContext transform (EF6  EF Core constructor/usings)
- RF-06: Conditional EF Core/Identity packages in csproj scaffold
- RF-07: Identity/session boilerplate in Program.cs scaffold
- RF-08: Redirect handler detection  minimal API TODO
- RF-10: Page title extraction from <%@ Page Title="..." %>
- RF-11: GetRouteUrl concrete replacement hints
- RF-12: QueryString/RouteData  SupplyParameterFromQuery/Parameter
- RF-13: ListView GroupItemCount flagging

Skill fixes (Beast - 6 items, already committed):
- RF-01: HTTP session/Interactive Server warning
- RF-02: Auth endpoint templates for cookie auth
- RF-05: LoginView preservation reinforcement
- RF-09: Enhanced navigation workaround patterns
- RF-13: ListView GroupItemCount skill example
- RF-14: DisableAntiforgery documentation

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

* docs(ai-team): log run9-prep session and merge decisions

Session: 2026-03-06-run9-prep
Requested by: Jeff (csharpfritz)

Changes:
- Logged session to .ai-team/log/2026-03-06-run9-prep.md
- Merged 3 decisions from inbox (forge, cyclops, beast)
- Deduplicated/consolidated decisions.md
- Propagated cross-agent updates
- Summarized Forge history.md (13KB -> 8.5KB)

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

* feat(migration): Run 9 WingtipToys migration  14/14 tests pass in 47 min

Layer 1: bwfc-migrate.ps1 produced 297 transforms across 32 files
Layer 2: Cyclops rewrote 28 code-behinds, created Data/Services
Manual fixes: ProductDetails AddToCart link, auth form HTML endpoints,
  navbar toggle element, register-without-auto-signin

82 files changed, 1692 insertions(+), 761 deletions(-)
All 14 acceptance tests pass (Navigation: 6, Cart: 5, Auth: 3)

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

* docs: Run 9 migration report with screenshots and comparison to Run 8

Executive report covering 47-minute migration (59% faster than Run 8).
Includes 6 page screenshots, side-by-side comparison tables,
5-round test iteration details, and Run 10 recommendations.

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

* docs(ai-team): Run 9 CSS/image failure RCA log and decisions

Session: 2026-03-06-run9-css-failure-rca
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 9 CSS/image failure RCA (Forge investigation)
- Merged inbox decision: forge-run9-css-failure-rca
- Deduplicated decisions.md (no duplicates found, 398 blocks)
- Propagated cross-agent update to cyclops, beast, rogue history.md

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

* Add StaticAssetTests: 11 Playwright smoke tests for CSS, images, and visual integrity

Addresses Run 9 RCA Fix 3. These acceptance tests catch the class of visual
failures where functional tests pass but CSS is missing (navbar as bullet list)
and product images return 404.

Tests cover:
- CSS file delivery and HTTP 200 status
- Product list image integrity (naturalWidth check + HTTP status)
- Bootstrap navbar class presence and minimum height
- Visual sanity screenshots for homepage, product list, product details
- Catch-all static asset 4xx/5xx detection

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

* fix: Add CSS bundle detection + auto-inject CSS links into App.razor

Fix 1a: ConvertFrom-MasterPage now extracts <webopt:bundlereference>
tags, flags them as [CSSBundle] manual review items, and injects TODO
comments into HeadContent. Also preserves CDN <link>/<script> refs
from <head> (Bootstrap, jQuery, etc.).

Fix 1b: New Invoke-CssAutoDetection function runs after static file
copy. Scans wwwroot/Content/, wwwroot/css/, and root wwwroot/ for
.css files. Scans source Site.Master for CDN references. Injects all
found <link> tags into App.razor <head> before <HeadOutlet>.

Addresses RC-1 from Run 9 CSS/Image Failure RCA  Layer 1 output
now ships with CSS references so Layer 2 doesn't start from zero.

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

* docs(ai-team): Phase 1 fixes merged  Run 10 prep

Session: 2026-03-07-run10-phase1-fixes
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-07-run10-phase1-fixes.md
- Merged 3 decision(s) from inbox into decisions.md (Forge, Beast, Rogue)
- Consolidated Fix 1 + Forge implementation and Fix 3 + Rogue implementation
- Propagated updates to affected agent history files (Cyclops, Beast, Forge)

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

* docs(ai-team): Run 10 failure logged, decisions merged

Session: 2026-03-07-run10-failure
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 10 failure to .ai-team/log/
- Merged inbox decisions (Layer 2 namespace convention, Run 10 failure directive)
- Propagated cross-agent updates to Cyclops, Forge, Beast, Rogue histories
- No deduplication needed (no duplicate headings found)

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

* docs(ai-team): Run 11 fixes - script + SKILL updates

Session: 2026-03-07-run11-fixes
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-07-run11-fixes.md
- Merged 6 decision(s) from inbox into decisions.md
- Consolidated 2 overlapping decisions (Coordinator domain work, FreshWingtipToys)
- Normalized Run 11 Cyclops migration decisions (h1->h3 format)
- Propagated updates to cyclops, beast, forge, rogue history files
- Summarized oversized history files (beast, cyclops, forge)

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

* Run 12: WingtipToys migration  25/25 acceptance tests pass (100%)

Complete ASP.NET Web Forms to Blazor migration of WingtipToys sample:
- Migration script (bwfc-migrate.ps1) processed 32 files, 303 transforms
- 79 static assets copied (CSS, images, fonts, scripts)
- 8 models, 3 services adapted for Blazor/EF Core patterns
- 16 Layer 2 fixes applied (validators, data-binding, routing)

Post-migration fixes:
- DI: Removed duplicate AddDbContext, use only AddDbContextFactory
- Cart operations: Minimal API endpoints for AddToCart/RemoveFromCart
  (bypasses InteractiveServer HttpContext limitation)
- Homepage: main element + container-fluid for test selector compatibility
- AddToCart link: JS onclick to bypass Blazor enhanced navigation 302 issue
- Package versions pinned to stable 10.0.0 (no preview versions)

Run history: Run 11 (17/25, 68%)  Run 12 (25/25, 100%)

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

* Add Run 12 migration report  25/25 (100%)

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

* fix(LoginView): null-check _user before accessing Identity in GetView()

During first render before OnInitializedAsync completes, _user is null.
Accessing _user.Identity throws NullReferenceException. Adding null check
ensures AnonymousTemplate is shown until auth state is resolved.

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

* fix(migrate): auto-add @using BlazorWebFormsComponents.LoginControls to _Imports.razor

Without this using, LoginView is not recognized as a component and its
child elements (AnonymousTemplate, LoggedInTemplate) render as raw HTML
instead of being assigned as RenderFragment parameters.

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

* fix: SSR default, pin packages, fix DI in migration script

- Remove @rendermode="InteractiveServer" from HeadOutlet and Routes in
  App.razor template (SSR by default, per-page opt-in)
- Add SSR guidance comment in App.razor template
- Pin NuGet package versions from 10.0.0-* wildcards to 10.0.0 stable
- Change DI template from AddDbContext to AddDbContextFactory with
  warning comment against dual registration
- Verified: LoginControls @using already present in _Imports.razor
- Verified: no enhanced-nav onclick workaround in script

Addresses Run 12 post-migration fixes 1-5.

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

* docs(ai-team): Merge Run 12 decisions + session log

Session: 2026-03-08-run12-improvements
Requested by: Jeff

Changes:
- Merged 3 decisions from inbox (LoginView namespace, Run 12 migration, SSR vs InteractiveServer)
- Consolidated 4 overlapping decision groups (LoginControls @using, LoginView preservation, render mode, SSR fragments)
- Logged session to .ai-team/log/2026-03-08-run12-improvements.md
- Propagated SSR-default and Run 12 decisions to 6 agent histories

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

* feat: Run 13 migration — 25/25 (100%) with SSR default

- SSR as default render mode (first run without InteractiveServer)
- 3 post-migration fixes (down from 6 in Run 12)
- Pipeline time ~22 min (down from ~90 min in Run 12)
- Includes migration report at dev-docs/migration-tests/wingtiptoys-run13-2026-03-08/

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

* docs(ai-team): Log Run 13 session + merge decisions

Session: 2026-03-08-run13-migration
Requested by: Jeff

Changes:
- Logged session to .ai-team/log/2026-03-08-run13-migration.md
- Merged 4 decisions from inbox into decisions.md (SSR enhanced nav, logout link, DbContextFactory, middleware order)
- Consolidated 2 overlapping decision pairs (enhanced nav bypass + Run 13 enhanced nav; Run 12 dual DbContext + Run 13 factory-only)
- Propagated updates to cyclops and forge history files

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

* chore: cleanup FreshWingtipToys + add Run 10/11 reports

- Remove temporary FreshWingtipToys folder (leftover from prior runs)
- Add Run 10 and Run 11 migration reports
- Update Run 9 report

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ity Run 19 (#425)

* feat: Post-merge validation with 100% acceptance tests

- 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>

* docs: reorganize dev-docs/migration-tests/ into project/runNN/ structure

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>

* docs: update Beast history and file reorg decision

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>

* docs(ai-team): log session, merge 3 decisions

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>

* Run 18b: Re-run migration after Checkout pattern fix

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>

* docs: Run 18c  ShoppingCart GridView fix confirmed after PayPal pattern 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>

* feat: Run 18 GridView ShoppingCart breakthrough with screenshots and 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>

* docs(ai-team): log Run 18 analysis, merge Forge improvement recommendations

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>

* refactor: standardize generic type params to ItemType across all BWFC 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>

* test(wingtiptoys): Run 19 - fresh Layer 1 migration with P0 fixes

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>

* Revert "test(wingtiptoys): Run 19 - fresh Layer 1 migration with P0 fixes"

This reverts commit 58fdc8c.

* docs: enforce mandatory L1L2 migration pipeline with no manual fixes

- 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>

* docs(ai-team): migration pipeline rules session log

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>

* WingtipToys Run 20: L1+L2 pipeline  0 errors clean build

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>

* Update Cyclops history with Run 20 learnings

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

* Fix L1 script + skills: preserve SelectMethod, correct review items

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>

* docs(ai-team): Log SelectMethod fix session, merge decisions

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>

* docs(ai-team): Summarize Cyclops and Beast history files

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>

* Fix build errors in Account pages: add stub properties and event handlers

- 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>

* Run 21: Validate SelectMethod preservation + L1 fixes

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>

* feat: L2 structural transform for ContosoUniversity sample

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>

* fix: ContosoUniversity  SQL Server LocalDB (not SQLite) + Run 19 report

- 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>

* fix(L1): Replace SQLite scaffolding with SQL Server in migration script

- 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>

* fix(skills): Enforce SQL Server preservation + mandatory SelectMethod 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>

* docs: Update Beast history + decision record for skill enforcement fixes

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

* docs(skills): Reframe database guidance  detect and match original provider

- 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>

* docs(team): Beast history + decision for provider detection framing

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

* docs(ai-team): Log skill enforcement fixes, merge 7 decisions

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>

* feat(L1): Auto-detect database provider from Web.config

- 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>

* docs(ai-team): Log provider detection session, merge decisions

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>

* docs: Update executive summary  lead with wins, refresh data + charts

- 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>

* docs(ai-team): Log exec summary update session, merge decisions

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>

* fix(tests+samples): Rename TItem to ItemType in all test and sample files

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>

* docs(ai-team): Log ItemType rename fix and decision

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

* fix(ci): Drop ClientSide build, fix CS1705 in test project

- 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>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(lib): Add L2 automation shims  Unit string, Response.Redirect, ViewState, GetRouteUrl

- OPP-2: Implicit string-to-Unit conversion (Width="125px" just works)
- OPP-3: ResponseShim wrapping NavigationManager for Response.Redirect() compat
- OPP-5: ViewState dictionary on WebFormsPageBase
- OPP-6: GetRouteUrl() on WebFormsPageBase

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

* docs: Update Cyclops history and decision inbox for L2 shims

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

* docs(ai-team): Log L2 automation session, merge Forge analysis

Session: 2026-03-11-l2-automation-tools
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-11-l2-automation-tools.md
- Merged Forge L2 automation analysis from inbox into decisions.md
- Merged Cyclops ItemType consumer coverage decision from inbox
- Merged Cyclops L2 shims implementation decision from inbox
- Propagated updates to affected agent history files (Beast, Cyclops, Forge, Jubilee, Rogue, Colossus)

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

* test: Add unit tests for L2 automation shims (OPP-2,3,5,6)

- Unit implicit string conversion: 17 tests
- ResponseShim: 9 tests
- ViewState on WebFormsPageBase: 10 tests
- GetRouteUrl on WebFormsPageBase: 7 tests

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

* docs: Update Rogue history + file ResponseShim null URL bug

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

* feat(lib): Add EnumParameter<T> for string-accepting enum parameters

Enables GridLines="None" syntax in Razor markup without @() wrapping.
Implicit conversions preserve backward compatibility with enum values.

New file: Enums/EnumParameter.cs - readonly struct with implicit
conversions (T->EP, string->EP, EP->T) and equality operators.

Components updated: BaseStyledComponent, BaseWebFormsComponent,
BulletedList, Calendar, Chart, ChartSeries, CheckBox, CheckBoxList,
DataPager, DetailsView, FormView, GridView, Image, ImageButton,
ImageMap, ListBox, ListView, Literal, Login, ChangePassword, Menu,
MenuItemStyle, MenuLevelStyle, NamingContainer, Panel, RadioButton,
RadioButtonList, ScriptManager, SiteMapPath, Table, TableCell,
TableFooterRow, TableHeaderCell, TableHeaderRow, TableRow, TextBox,
TreeNode, TreeView, UiPagerSettings, UiStyle, UiTableItemStyle,
UpdatePanel, BaseValidator, Style, TableItemStyle

Interfaces updated: IImageComponent, IHasLayoutStyle, IHasLayoutTableItemStyle

Skipped (abstract classes, not enums): DataListEnum, RepeatLayout,
ButtonType, TreeViewImageSet, ValidationSummaryDisplayMode

Test files needing .Value for ShouldBe(): ListView/SortingEvents,
ScriptManager/ScriptManagerTests, UpdatePanel/UpdatePanelTests,
Localize/InheritsLiteral

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

* docs: Update cyclops history and decisions for EnumParameter<T>

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

* fix(tests): Update EnumParameter assertions + fix ResponseShim null guard

- Add .Value to ShouldBe/Assert calls for EnumParameter<T> compatibility
- Fix ResponseShim.Redirect null URL: ArgumentNullException instead of NRE
- Update test expectation from NullReferenceException to ArgumentNullException

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

* docs: Add L2 automation shims documentation

- EnumParameter<T>: string-accepting enum parameters across 46 components
- ResponseRedirect: Response.Redirect() navigation shim
- L2AutomationShims: Overview of all Layer 2 migration automation features
- Updated mkdocs.yml nav with new utility feature pages

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

* docs(ai-team): log L2 analysis discussion session

Session: 2026-03-12-l2-analysis-discussion
Requested by: Jeffrey T. Fritz

Changes:
- logged session to .ai-team/log/2026-03-12-l2-analysis-discussion.md
- merged inbox decisions into decisions.md (EnumParameter<T>, ResponseShim null bug)
- consolidated 3 overlapping L2 automation decisions into 1
- propagated team updates to rogue, beast, forge, cyclops histories
- orchestration log for Forge analysis

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

* docs(ai-team): merge cookie degradation directive and PageTitle dedup decision

Session: 2026-03-12-pagetitle-dedup-and-cookie-decision
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged cookie graceful degradation directive from inbox
- Merged PageTitle dedup decision from inbox
- Merged render mode guards decision from inbox
- Propagated updates to Cyclops, Beast, and Forge history files

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

* docs(ai-team): merge cookie degradation directive, consolidate decisions, summarize histories

Session: 2026-03-12-pagetitle-dedup-and-cookie-decision
Requested by: Jeffrey T. Fritz

Changes:
- Merged Pattern B+ cookie graceful degradation directive from inbox
- Consolidated duplicate cookie decisions in decisions.md
- Summarized oversized history.md files (forge, cyclops, beast, rogue)
- Archived detailed entries to history-archive.md files

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

* docs(ai-team): merge PageTitle dedup decision

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

* feat: render mode guards, Request/Response shims, PageTitle dedup

Add HttpContext availability guards to WebFormsPageBase:
- IsHttpContextAvailable property for SSR vs interactive detection
- RequireHttpContext() throws for members needing HttpContext
- GetRouteUrl guarded with clear error message

Add Request compatibility shim (RequestShim):
- Request.Cookies: EmptyRequestCookies fallback when no HttpContext
- Request.QueryString: NavigationManager.Uri fallback
- Request.Url: NavigationManager.Uri fallback

Expand Response shim with cookie support (Pattern B+):
- Response.Cookies: NullResponseCookies no-op fallback
- Both cookie classes log warning on first access per instance

Add PageTitle deduplication to L1 migration script:
- ConvertFrom-PageDirective suppresses <PageTitle> when code-behind
  contains Page.Title assignment (L2 handles it instead)

Update test infrastructure:
- BlazorWebFormsTestContext always registers ILogger<T>
- MockNavigationManager accepts optional initial URI
- New RenderModeGuardTests (8 tests)
- New RequestShimTests (7 tests)

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

* migrated squad

* fix: correct three L1 script bugs found during ContosoUniversity migration

1. _Imports.razor template now includes @inherits WebFormsPageBase (was
   documented in METHODOLOGY.md but missing from script template)
2. MainLayout header now injects <BlazorWebFormsComponents.Page /> component
   (also documented but missing from script)
3. ContentPlaceHolder->@Body regex extended to match ContentPlaceHolder1 and
   BodyContent in addition to MainContent

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

* test: regenerate AfterContosoUniversity with fixed L1 script

Regenerated using corrected bwfc-migrate.ps1 that now:
- Adds @inherits WebFormsPageBase to _Imports.razor
- Injects <Page /> component in MainLayout
- Matches ContentPlaceHolder1 for @Body replacement

76 build errors remain (34 CS + 42 Razor)  all expected L2 work:
- CS: System.Web.UI usings, BLL namespaces, EF6 types
- RZ: Missing ItemType params, GridView style children, MainLayout tags

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

* feat: L1 script improvements  strip System.Web usings, copy BLL dirs, fix HeadContent

1. Strip System.Web.* usings from code-behind files during copy (eliminates
   ~18 CS errors per migration)
2. Copy BLL/, BusinessLogic/, Logic/, Services/ directories alongside Models/
   with System.Web using removal and TODO headers
3. Fix HeadContent generation:
   - Filter out empty <title></title> tags (Page component handles title)
   - Capture full <script src=cdn>...</script> tags including closing tag
     (was only capturing opening tag, causing unclosed tag errors)

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

* feat: add ItemType="object" fallback for generic BWFC components in L1

When generic BWFC components (GridView, DetailsView, DropDownList, BoundField,
etc.) lack an explicit ItemType attribute, the L1 script now adds
ItemType="object" as a safe compilable default. L2 can refine to actual
model types. Eliminates ~16 RZ10001 'type cannot be inferred' Razor errors.

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

* test: ContosoUniversity L1+L2 migration builds with 0 errors

L1: bwfc-migrate.ps1 with ItemType=object fallback (1.5s)
L2: AI-assisted semantic transforms (~15min)

Transforms: WebForms to Blazor patterns, EF6 to EF Core DI,
GridView styles to render fragment pattern, hex color Razor syntax,
enum qualification, stripped ScriptManager/UpdatePanel/WebMethod

Result: 0 errors, 12 warnings (pre-existing NU1510 from BWFC lib)
Blocked: 4 SortedStyle components (scheduled for library creation)

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

* sensei: improve migration-toolkit skill frontmatter descriptions

Add WHEN: trigger phrases to all 4 migration-toolkit skills:
- migration-standards: Low  Medium-High
- bwfc-migration: Low  High (added FOR SINGLE OPERATIONS routing)
- bwfc-identity-migration: Low  Medium-High
- bwfc-data-migration: Low  Medium-High

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

* sensei: split bwfc-migration skill into main + 2 child docs

Extract controls-specific sections to reduce SKILL.md from ~8,707 to ~3,981 tokens
(under 5,000 hard limit):

- CONTROL-REFERENCE.md (~3,434 tokens)  Control translation tables,
  component coverage summary, structural/theming/custom control base classes
- CODE-TRANSFORMS.md (~1,549 tokens)  Code-behind lifecycle, event handlers,
  navigation, data binding, Master Page to Layout conversion

Main SKILL.md retains: installation, migration pipeline, page rules,
reference links, gotchas, and per-page checklist.

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

* sensei: split bwfc-data-migration skill into main + child doc

Extract architecture plumbing sections to reduce SKILL.md from ~6,296 to ~4,224 tokens
(under 5,000 hard limit):

- ARCHITECTURE-TRANSFORMS.md (~2,223 tokens)  Global.asax to Program.cs,
  Web.config to appsettings.json, route table to @page directives, HTTP
  handlers/modules to middleware, third-party integrations, files to create,
  Blazor enhanced navigation workarounds

Main SKILL.md retains: session state warning, EF6 to EF Core, DataSource to
services, session to scoped services, common gotchas, and reference link.

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

* Add contoso-migration-test skill for end-to-end CU benchmark

Workflow skill that orchestrates:
- Phase 0: Prep (determine run number, clear output)
- Phase 1: L1 automated script (~1s)
- Phase 2: L2 Copilot-assisted transforms (~20-30 min)
- Phase 3: Build validation
- Phase 4: Playwright acceptance tests (40 tests)
- Phase 5: Report generation with standard template

Includes REPORT-TEMPLATE.md child doc with all required sections.

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

* Move contoso-migration-test to .github/skills (not a shipping skill)

migration-toolkit/skills/ contains skills that ship to customers.
The migration test skill is an internal dev/CI tool, so it belongs
in .github/skills/ with other project-level skills.

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

* fix(ContosoUniversity): add BWFC middleware and DB initialization

- Add app.UseBlazorWebFormsComponents() for .aspx URL rewriting (fixes 20+ test failures)
- Add Database.EnsureCreated() at startup to auto-create LocalDB schema (fixes HTTP 500s)
- BLL service registrations and connection string were already correct

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

* fix: resolve 3 bug clusters blocking 16 acceptance tests

Cluster 1 (7 tests): Add OnModelCreating to ContosoUniversityEntities
to explicitly map Enrollment.Cours FK to Enrollment.CourseID, preventing
EF Core from generating a shadow FK (CourseID1) due to the non-standard
navigation property name.

Cluster 2 (5 tests): Nav link IDs were already present. Added @page '/'
route to Home.razor so root URL serves the layout with nav links.

Cluster 3 (4 tests): Added PageTitle to Home.razor. About GridView and
Courses DetailsView markup was already correct -- data loading fixes
from Cluster 1 should cascade to resolve these.

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

* fix: robust DB schema creation with seed data for ContosoUniversity

EnsureCreated() is a no-op when the database already exists, leaving
the schema incomplete (missing Enrollments table). This caused HTTP 500
on Students and Instructors pages which query the DB in OnInitialized.

Now validates all tables exist on startup, drops and recreates the DB
if schema is stale, and seeds sample data for Students, Instructors,
Courses, Departments, and Enrollments.

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

* ContosoUniversity migration test Run 20: 37/40 (92.5%)

End-to-end migration benchmark results:
- L1: 1.23s, 88 transforms, SelectMethod preserved
- L2: ~80 min (incl. 4 test-fix iterations), 39 files transformed
- Build: 0 errors, 4 warnings (BWFC library only)
- Tests: 37/40 passed (Home 100%, About 100%, Instructors 100%,
  Navigation 100%, Courses 83%, Students 78%)
- 3 remaining failures: interactive form handlers (add/search)

Report at dev-docs/migration-tests/contosouniversity/run20/REPORT.md

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

* docs(squad): ContosoUniversity Run 20 orchestration, session log, and decision merge

Session: 2026-03-13-cu-run20
Requested by: Jeffrey T. Fritz
Branch: squad/l2-automation-tools

Changes:
- Orchestration logs: 8 agent spawns (Cyclops 3, Colossus 3, Beast 1, Scribe 1)
- Session log: ContosoUniversity Run 20 final summary (37/40 tests passing, 92.5%)
- Decision inbox: Merged 4 decisions from inbox/ to decisions.md (aspx links, sorted styles, L2 patterns)
- Inbox cleaned: Deleted 4 inbox files after merge

* fix: add UseBlazorWebFormsComponents() to migration skill Program.cs templates

The ARCHITECTURE-TRANSFORMS.md Program.cs template was missing
app.UseBlazorWebFormsComponents() from the middleware pipeline, which
is why L2 agents never added it. Added to both the child doc template
and the main SKILL.md service registration pattern.

Reverted contoso-migration-test skill  it's a test harness, not
the source of truth for what to build.

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

* fix: preserve form wrapper as div and fix CSS paths in L1 script

Two CSS/layout bugs in bwfc-migrate.ps1 caused migrated sites to
render with broken layouts:

1. ConvertFrom-FormWrapper now replaces <form runat=server> with
   <div> (preserving id attr) instead of stripping it. The form
   wrapper creates a block formatting context that CSS positioning
   depends on  removing it broke relative positioning in page CSS.

2. ConvertFrom-MasterPage now rewrites relative CSS href paths to
   absolute (prefix with /) in extracted <link> tags. Relative paths
   in <HeadContent> resolve from the page URL, not the component,
   causing 404s on sub-pages.

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

* docs: update bwfc-migration skill to reflect formdiv replacement and CSS path fixes

- SKILL.md: 3 references updated from 'remove form wrapper' to 'replace with div'
- SKILL.md: added explanation of CSS block formatting context preservation
- CODE-TRANSFORMS.md: updated Master Page key changes for formdiv
- CODE-TRANSFORMS.md: added CSS path rewriting note (relativeabsolute for HeadContent)

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

* fix: add mandatory child doc reading instruction to bwfc-migration Layer 2

The Reference Documents section was a passive footnote at the bottom of
SKILL.md. Agents doing Layer 2 transforms never saw the instruction to
read CODE-TRANSFORMS.md and CONTROL-REFERENCE.md, causing them to miss
lifecycle mappings, control translation tables, and structural component
guidance. Moved the instruction to the top of the Layer 2 section with
a loud MANDATORY warning and full content summaries so agents know
exactly what each doc contains.

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

* test: ContosoUniversity migration Run 21  35/40 tests passing (87.5%)

Run 21 completes in ~34 min total (69% faster than Run 20's 80 min).
L1 script: 0.93s, L2 transforms: ~25 min, 3 build iterations.

Key improvements from Run 20:
- Mandatory child doc reading prevented repeated mistakes
- Added @using BlazorWebFormsComponents.Enums to _Imports.razor
- Fixed EF Core Cours primary key with [Key] attribute
- All BWFC attribute syntax corrected (lowercase bools, WebColor, type-qualified enums, bare int Units)
- Added <title> to App.razor, root route to Home.razor

5 remaining failures are BWFC component behavioral limitations:
- GridView CRUD (delete/edit/add don't refresh)
- DropDownList prerender with string Items
- DetailsView with anonymous type objects

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

* docs(ai-team): EDMXEF Core architecture decision merged  L1 script enhancement

Session: 2026-03-13T20-25-31Z-edmx-architecture

Changes:

- Merged Forge decision to .squad/decisions.md

- Created session log: .squad/log/2026-03-13T20-25-31Z-edmx-architecture.md

- Created orchestration log: .squad/orchestration-log/2026-03-13T20-25-31Z-forge.md

Decision: Enhance bwfc-migrate.ps1 with EDMX parsing

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

* feat: add EDMXEF Core parser script for L1 migration

- New Convert-EdmxToEfCore.ps1 parses SSDL/CSDL/C-S Mapping
- Generates entity classes with [Key], [Required], [MaxLength], etc.
- Generates DbContext with OnModelCreating() FK relationships + cascade deletes
- Integrated into bwfc-migrate.ps1 Models section
- Skips EDMX artifacts (*.edmx, *.tt, *.Designer.cs)

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

* docs(ai-team): Merge EDMX parser decision + session log

Session: 2026-03-13T20-38-33Z-edmx-parser-build
Requested by: Scribe

Changes:
- Merged cyclops-edmx-parser.md decision to decisions.md
- Created session log (what, deliverables, next action)
- Created orchestration log (Cyclops routing info)
- Deleted inbox file

* docs(ai-team): Merge Forge EDMX parser review decision, create orchestration log

Session: 2026-03-13-forge-edmx-review
Requested by: Scribe

Changes:
- Merged decision from .squad/decisions/inbox/forge-edmx-review.md  decisions.md
- Forge approval for Cyclops EDMXEF Core parser (all Run 21 requirements verified, 5 non-blocking suggestions noted)
- Created orchestration log: 2026-03-13T20-45-00Z-forge.md
- Deleted inbox file after merge

* Run 22: ContosoUniversity migration test  39/40 (97.5%)

EDMX parser eliminates all 5 model/FK failures from Run 21 (35/40).
New Convert-EdmxToEfCore.ps1 correctly generates entity classes with
PKs, FKs, cascade deletes, and full DbContext OnModelCreating.

Fixed L1 EDMX array bug (Set-StrictMode + single FileInfo .Count).
L2 transforms applied to all 6 pages, 4 BLL classes, infrastructure.
6 build iterations to resolve all errors.

Remaining failure: StudentsPage_AddNewStudentFormWorks (binding timing).

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

* docs(ai-team): UpdatePanel ContentTemplate enhancement — session log, orchestration logs, decision merge

Session: 2026-03-13-updatepanel-contenttemplate
Requested by: Scribe (automated)

Changes:
- Created 4 orchestration logs (Cyclops, Rogue, Jubilee, Colossus)
- Created session log with decision summary
- Merged 5 decisions from inbox to decisions.md (no deduplication needed — distinct decisions)
- Deleted 4 inbox decision files after merge
- Updated Cyclops, Jubilee, Colossus history.md with cross-agent team updates
- Rogue history.md updated with ContentTemplate TDD test summary

Decisions merged:
1. UpdatePanel ContentTemplate + BaseStyledComponent base class (Cyclops)
2. UpdatePanel ContentTemplate test coverage — 12 TDD tests (Rogue)
3. AJAX Controls section added to ComponentList.razor (Jubilee)
4. UpdatePanel sample page with 6 usage patterns (Jubilee)
5. UpdatePanel integration test coverage — 3 Playwright tests (Colossus)

All UpdatePanel tests passing (24/24). All agent orchestration logs created.

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

* Add ContentTemplate render fragment to UpdatePanel

- Add ContentTemplate RenderFragment parameter matching Web Forms ITemplate
- Render ContentTemplate ?? ChildContent for backward compatibility
- Change base class to BaseStyledComponent (enables CSS styling)
- Add 24 bUnit tests (12 new ContentTemplate + 12 existing)
- Add sample page with 6 usage patterns (migration, styling, render modes)
- Add 3 Playwright interaction tests + smoke test
- Eliminates RZ10012 warnings for ContentTemplate in L1 migration output
- Forge reviewed: APPROVED for Web Forms fidelity

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

* fix: update L1 code-behind TODO header for UpdatePanel as BWFC component

The code-behind TODO header previously said 'UpdatePanel / ScriptManager
references -> remove', which is misleading now that UpdatePanel is a valid
BWFC component with ContentTemplate support. Split into separate guidance:
ScriptManager -> remove, UpdatePanel -> preserved by BWFC.

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

* docs: update migration-toolkit with UpdatePanel ContentTemplate support

- CONTROL-REFERENCE.md: added UpdatePanel ContentTemplate section with
  before/after examples and key implementation points
- L1 script: clarified UpdatePanel markup is preserved (ContentTemplate
  now a valid BWFC RenderFragment)
- Squad agent history and decision records updated

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

* fix: harden AddNewStudent Playwright test for Blazor Server timing

- Blur last TextBox field before clicking Insert to ensure @onchange fires
- Increase post-click wait from 500ms to 1000ms for full SignalR round-trip
- Add 3-second retry loop polling for row count change or name in DOM
- No changes to other test methods

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

* fix: use LEFT JOIN in GetJoinedTableData so students without enrollments appear in GridView

The SelectMany query was an INNER JOIN that excluded students without
enrollments. Changed to Students.Include(Enrollments) with a foreach
loop that shows Count=0 for students with no enrollments.

This fixes the last failing acceptance test (StudentsPage_AddNewStudentFormWorks)
where a newly added student would not appear if no course enrollment was created.

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

* docs(ai-team): Session log + decision merge + agent history updates

Session: 2026-03-14T13-22-00Z-students-left-join-fix
Requested by: User (Scribe directive)

Changes:
- Logged Cyclops spawn (Students LEFT JOIN fix) to orchestration-log
- Logged Colossus spawn (test timing verification) to orchestration-log
- Created session log: Students LEFT JOIN + test timing
- Merged 4 inbox decisions into decisions.md (Students LEFT JOIN + UpdatePanel enhancement + UpdatePanel docs + Forge review)
- Deduplicated and consolidated decisions (UpdatePanel decisions into single comprehensive entry)
- Deleted inbox files (4 total)
- Appended team updates to Cyclops/Colossus/Beast/Forge history.md files

* feat: migration toolkit improvements from Run 22 analysis

L1 Script (bwfc-migrate.ps1):
- Strip <ContentTemplate> wrappers to eliminate RZ10012 warnings
- Auto-add @page "/" root route for Home/Default/Index pages
- Generate <PageTitle> from Content title placeholders and Page Title attribute
- Normalize ID="x" to id="x" for HTML/CSS/JS selector compatibility

EDMX Parser (Convert-EdmxToEfCore.ps1):
- Handle StoreGeneratedPattern=Computed with [DatabaseGenerated] annotation

Migration Skills Documentation:
- Document var usage requirement (IDE0007 enforced as error)
- Document BWFC TextBox blur-based binding timing for Playwright tests
- Add concrete session state examples (minimal API, scoped service, DB-backed)

Issue Plan:
- 34 issues across 4 milestones (M20-M23) for component parity

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

* fix: handle EnumParameter<T> in Style.FromAttributes reflection

Style.FromAttributes used Convert.ChangeType which cannot convert
strings to EnumParameter<T>. Added pattern match for generic
EnumParameter<> types that parses the underlying enum and creates
the wrapper via Activator.CreateInstance. Also removed unnecessary
Convert.ChangeType call since all branches now produce correctly
typed values.

Fixes: DataList InlineHeaderStyle tests (2 failures on CI)

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

* fix: UpdatePanel Playwright tests use correct locators

BWFC Button renders as <input type='submit'>, not <button>.
Tests used 'button.btn-primary' which never matched. Fixed to:
- Scope each test to data-audit-control section for isolation
- Use input[type='submit'] locators (matching actual BWFC output)
- Fix text mismatches ('Click Me' vs actual 'Increment')
- Fix inline mode: 'The time is:' vs actual 'The current time is'

Fixes 3 Playwright integration test failures on CI.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: M20 batch 1 — ToolTip on base class, AccessKey rendering, GridView style merging

Issues resolved:
- #15 AccessKey — already on BaseWebFormsComponent; added accesskey rendering to
  TextBox, HyperLink, Panel, Image, CheckBox (was missing from 5 components)
- #16 ToolTip — moved from BaseStyledComponent up to BaseWebFormsComponent;
  removed duplicates from ChartSeries and MenuItem
- #17 DataBoundComponent → BaseStyledComponent — already implemented
- #18 Image/Label → BaseStyledComponent — already implemented

Additional fixes:
- GridView: merge border-collapse:collapse with base style props (BackColor,
  ForeColor, Width, Height) via GetCombinedTableStyle()

Tests: 37 new bUnit tests (1587 total, all passing)

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

* feat: M20 batch 2 — RequiredFieldValidator InitialValue, FormView CssClass, sample pages

Issues resolved:
- #45 RequiredFieldValidator InitialValue — validates against configurable
  initial value instead of just empty string (Web Forms parity)
- #33 FormView CssClass/style — renders class and merged style on outer table

Verified already implemented (no changes needed):
- #19 Validator Display, #20 SetFocusOnError, #27 Login base classes,
  #31 ValidationSummary, #36 DataTextFormatString, #37 AppendDataBoundItems,
  #38 Label AssociatedControlID, #39 Panel BackImageUrl, #40 TextBox ReadOnly/MaxLength,
  #46 CompareValidator, #24 GridView paging, #25 sorting, #26 editing,
  #35 row selection, #23/#34 Calendar styles, #43 DataList, #41/#42 ListView,
  #44 FormView DefaultMode

New: BaseProperties sample page with AccessKey, ToolTip, GridView styling demos

Tests: 8 new bUnit tests (1595 total, all passing)

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

* test: Playwright integration tests for BaseProperties sample page

- Smoke test: /ControlSamples/BaseProperties added to ControlSampleTests
- AccessKey rendering verification (input, textbox, anchor)
- ToolTip/title attribute verification across controls
- GridView style properties (background-color, width) on table

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

* docs(squad): M20 Batch 6 orchestration logs and decision merge

Session: 20260314-m20-batch6
Requested by: Scribe

Changes:
- Created orchestration logs for Forge, Cyclops, Rogue, Scribe (batch 6 spawns)
- Created M20 Batch 6 session log (parallel work items #28, #29, #48)
- Merged 5 decision inbox files to decisions.md (L1 script fixes, base class, documentation, EDMX)
- Deleted inbox files after merge
- Appended team updates to Forge, Cyclops, Rogue history files

* feat: M20 health dashboard scoring spec + L1 script WIP

- Forge: complete 7-dimension scoring methodology for component health
  dashboard (#48) — property parity, HTML fidelity, bUnit tests,
  integration tests, style support, sample pages, event support
- Reference data for 60+ components across 9 categories
- L1 script improvements in progress (#28)
- L1 test harness in progress (#29)
- Health dashboard Blazor front page in progress (#48)

Note: Cyclops (#28), Rogue (#29), and Jubilee (#48) agents still
running — their output will be committed in the next session.

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

* feat: L1 script ~40% → ~60% automation coverage (#28)

Add 5 new transformation categories to bwfc-migrate.ps1:

Markup transforms (Normalize-AttributeValues + Add-DataSourceIDWarning):
- Boolean normalization: True/False → true/false (with text-attr exclusions)
- Enum type-qualifying: 18 attribute→enum mappings (GridLines→@GridLines.Both)
- Unit normalization: strip px suffix from Width/Height/etc (bare int = pixels)
- DataSourceID removal + data source control replacement with TODO comments

Code-behind transforms (enhanced Copy-CodeBehind):
- Response.Redirect → NavigationManager.NavigateTo (4 patterns)
- Session[\"key\"] detection with migration guidance block
- ViewState[\"key\"] detection with suggested field declarations

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

* test: L1 migration test harness — 10 cases, 70% pass baseline (#29)

- 10 focused test cases covering: asp: prefix removal, attribute
  stripping, directives, form wrappers, expressions, URL normalization,
  comments, content wrappers, ItemType conversion
- Run-L1Tests.ps1 runner with line-accuracy scoring (~94.3%)
- Baseline: 7/10 pass, 3 known L1 bugs documented
  (partial Eval, content wrapper indentation, ItemType double-add)
- ~114ms per file average execution time

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fixes #441

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: Implement ConfirmButtonExtender and FilteredTextBoxExtender

- Update BaseExtenderComponent with full JS module lifecycle
- Add ConfirmButtonExtender (#451) with browser confirm() support
- Add FilteredTextBoxExtender (#450) with keypress filtering
- JS modules for both extenders in wwwroot/js/
- FilterType (flags) and FilterMode enums

Fixes csharpfritz#58
Fixes csharpfritz#59

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

* docs: Add documentation for Ajax Toolkit extender components

- Create ConfirmButtonExtender.md with usage examples, properties, and migration guidance
- Create FilteredTextBoxExtender.md with character filtering patterns and examples
- Create AjaxToolkit/index.md as overview of extender pattern and render mode requirements
- Update mkdocs.yml to add new 'Ajax Control Toolkit Extenders' navigation section

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

* feat: Add sample pages for Ajax Toolkit extender components

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

* test: Add bUnit tests for ConfirmButtonExtender and FilteredTextBoxExtender

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: Implement ModalPopupExtender and CollapsiblePanelExtender

Fixes #446  ModalPopupExtender with overlay, focus trap, drag support
Fixes #447  CollapsiblePanelExtender with CSS transitions, toggle states

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

* docs: Add documentation for ModalPopupExtender and CollapsiblePanelExtender

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

* Update Beast history: Document ModalPopupExtender and CollapsiblePanelExtender documentation delivery

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

* feat: Add sample pages for ModalPopupExtender and CollapsiblePanelExtender

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

* test: Add bUnit tests for ModalPopupExtender and CollapsiblePanelExtender

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

* feat: Implement 10 Ajax Toolkit components (Accordion, TabContainer, Calendar, AutoComplete, MaskedEdit, NumericUpDown, Slider, ToggleButton, PopupControl, HoverMenu)

Adds container components (Accordion/AccordionPane, TabContainer/TabPanel) and
8 extender components following the BaseExtenderComponent pattern with JS interop.
All include full property parity with ASP.NET Ajax Control Toolkit originals.

Fixes #444, Fixes #445, Fixes #448, Fixes #449
Fixes #452, Fixes #453, Fixes #454, Fixes #455
Fixes #456, Fixes #457

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

* test/docs/samples: Add tests, documentation, and samples for all 10 Ajax Toolkit components

- 265 new bUnit tests (Accordion, TabContainer, Calendar, AutoComplete,
  MaskedEdit, NumericUpDown, Slider, ToggleButton, PopupControl, HoverMenu)
- 10 MkDocs documentation pages with migration guides and property tables
- 10 sample pages with 40+ interactive demos in AfterBlazorServerSide
- Updated AjaxToolkit index, mkdocs.yml nav, and ComponentCatalog

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

* feat: Update L1 migration script for ajaxToolkit prefix conversion (#443)

Add ConvertFrom-AjaxToolkitPrefix function that:
- Strips ToolkitScriptManager entirely (not needed in Blazor)
- Converts 16 known ajaxToolkit: controls to Blazor equivalents
- Falls back to TODO comments for unrecognized controls
- Adds @using BlazorAjaxToolkitComponents to _Imports.razor scaffold
All regex patterns use (?s) single-line mode for multi-line tags.

Fixes #443

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

* docs/samples: Add Ajax Toolkit migration guide and showcase page

- Comprehensive migration guide (docs/AjaxToolkit/migration-guide.md) covering
  all 14 controls with before/after examples, installation, troubleshooting
- AjaxToolkitShowcase page demonstrating 10 controls in one interactive page
- Updated mkdocs.yml nav and AjaxToolkit index

Fixes #458, Fixes #459

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…and .NET 10 patterns (#467)

* Initial plan

* Add L3 performance optimization skill and update migration toolkit docs

Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
…464)

* feat: Add performance benchmark suite comparing .NET Framework vs .NET 10

Benchmark infrastructure:
- Run-Benchmarks.ps1: Orchestrates IIS Express + dotnet run, measures cold start,
  warm avg, P95, min, max response times across multiple pages
- Generate-BenchmarkReport.ps1: Produces Markdown report with SVG bar charts
- Supports -SkipFramework, -Iterations, -WhatIf flags

Initial results (partial - some apps have pre-existing build issues):
- WingtipToys (.NET Framework 4.5.2): Home 8.7ms, ProductList 12.1ms, About 7.5ms
- AfterContosoUniversity (.NET 10 Blazor): Home 2.5ms, Students 9.6ms, About 3.8ms

Fixes #424

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

* skill: Add performance-benchmarks skill for benchmark execution and diagnosis

Documents the full benchmark workflow: scripts, app matrix, known issues,
pre-flight checks, metrics interpretation, and re-run procedures.

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

* fix: Fix AfterWingtipToys build error and increase IIS Express timeout

- Add @using Microsoft.AspNetCore.Identity to ManageLogins.razor (fixes CS0246)
- Increase ContosoUniversity IIS Express timeout from 30s to 60s

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

* perf: Complete benchmark run with WingtipToys head-to-head comparison

WingtipToys results (50 iterations):
- Home: Framework 6ms avg  Blazor 3.2ms avg (1.9x faster)
- ProductList: Framework 10ms avg  Blazor 2.4ms avg (4.2x faster)
- About: Framework 6.7ms avg  Blazor 2.8ms avg (2.4x faster)

ContosoUniversity Framework: IIS Express cannot JIT-compile the
.NET Framework 4.5.2 app with old Roslyn compiler within 180s.
Blazor-only results included (Home 1.8ms, Students 7.2ms, About 3.2ms).

Includes updated SVG charts and benchmark report.

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

* perf: Add MSBuild pre-compilation for Framework apps + update skill

- Add Find-MSBuild helper to locate MSBuild.exe (VS 2022/2019/2017 + vswhere)
- Pre-compile .NET Framework projects before IIS Express launch
- Pre-compile ASP.NET views with aspnet_compiler.exe
- Start LocalDB automatically before Framework app benchmarks
- Add IIS Express stderr capture for diagnostic output on failures
- Update performance-benchmarks skill with fixes and new patterns
- Re-run benchmarks with complete results

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

* perf: Complete 4-app benchmark with MSBuild pre-compilation

All 4 apps now benchmark successfully:
- WingtipToys: Framework 6.4/8.3/4.9ms  Blazor 2.4/3.6/3.1ms (1.6-2.7x faster)
- ContosoUniversity: Framework 2.2/6.5/3.6ms  Blazor 1.6/6.3/2.8ms (1.0-1.4x faster)

Fixes applied:
- Find-MSBuild now checks VS 2026 (v18) first, then 2022/2019/2017
- ContosoUniversity uses .aspx URLs (no default document at /)
- Readiness check uses first page URL instead of base URL
- EF6/EF Core table rename (EnrollmentEnrollments) around Framework benchmark
- Clear-BenchmarkPorts kills stale IIS Express on startup
- Skill bumped to high confidence

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

* docs: add Ajax Toolkit to README and L1 migration skill

- Added ## Ajax Control Toolkit Components section to README.md with NuGet badge and 14 component links
- Created .squad/skills/migration-standards/ajax-toolkit-migration.md for L1 automation guidance
- Updated migration-standards SKILL.md with reference to companion document
- Fixed NuGet badge URL to match actual PackageId

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

* docs: add AJAX-TOOLKIT.md to bwfc-migration skill

- Created migration-toolkit/skills/bwfc-migration/AJAX-TOOLKIT.md with full ACT migration reference
- Updated SKILL.md to reference AJAX-TOOLKIT.md in Layer 2 mandatory reads and Reference Documents
- Updated CONTROL-REFERENCE.md: removed outdated 'Not Covered' entry, added Ajax Toolkit section
- 14 supported ACT components documented with installation, detection, L1/L2 patterns, examples

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: Add TextBoxWatermarkExtender

Implements placeholder text for TextBox controls, matching the original
Ajax Control Toolkit TextBoxWatermarkExtender behavior.

- WatermarkText property for placeholder text
- WatermarkCssClass for styling the watermark state
- JS behavior handles focus/blur/input events

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

* feat: Add DragPanelExtender

Makes panels draggable by a handle element. Matches the original
Ajax Control Toolkit DragPanelExtender behavior.

- DragHandleID property to specify the drag handle element
- Falls back to entire target if no handle specified
- Handles edge cases (text selection, left-click only)

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

* feat: Add ResizableControlExtender

Allows users to resize elements by dragging a handle. Matches the original
Ajax Control Toolkit ResizableControlExtender behavior.

- HandleCssClass for styling the resize handle
- ResizableCssClass applied while actively resizing
- Min/Max width and height constraints
- Creates resize handle if not found

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

* Add DropShadowExtender and AlwaysVisibleControlExtender

- DropShadowExtender: CSS box-shadow with opacity, width, rounded corners, position tracking
- AlwaysVisibleControlExtender: Fixed positioning with 9 anchor points, offsets, animation support
- New enums: HorizontalSide, VerticalSide for positioning

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

* Add RoundedCornersExtender and UpdatePanelAnimationExtender

- RoundedCornersExtender: Selective border-radius with BoxCorners enum, optional background color
- UpdatePanelAnimationExtender: MutationObserver-based update detection with CSS class and fade animations
- New enum: BoxCorners (flags for corner selection)

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

* Add PasswordStrength and MaskedEditExtender

- PasswordStrength: Real-time password quality indicator with text/bar modes, 5 strength levels
- MaskedEditExtender: Input masking for phone/date/SSN with configurable mask patterns
- New enums: DisplayPosition, StrengthIndicatorType, MaskType, InputDirection, AcceptNegative, DisplayMoney

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

* Add ValidatorCalloutExtender and HoverMenuExtender

- ValidatorCalloutExtender: Validation error callout bubbles with positioning, highlight CSS, icons
- HoverMenuExtender: Hover-triggered popup menus with delays and positioning
- New enum: PopupPosition (TopLeft, TopRight, BottomLeft, BottomRight)

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

* Add SlideShowExtender

- SlideShowExtender: Image carousel with auto-play, navigation controls, slide titles/descriptions
- Client-side slide management via Slides parameter or data-slides attribute
- Play/pause, next/previous controls with configurable interval

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

* Add ListSearchExtender and BalloonPopupExtender

- ListSearchExtender: Type-to-filter for ListBox/DropDownList with Contains/StartsWith matching
- BalloonPopupExtender: Styled tooltip balloons with pointer arrows, multiple trigger modes
- New enums: PromptPosition, QueryPattern, BalloonStyle, BalloonSize, BalloonPosition

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

* Add docs, tests, and migration guide for new ACT extenders

Documentation (12 new files in docs/AjaxToolkit/):
- TextBoxWatermark, DragPanel, ResizableControl, DropShadow
- AlwaysVisibleControl, RoundedCorners, UpdatePanelAnimation
- PasswordStrength, ValidatorCallout, SlideShow, ListSearch, BalloonPopup
- Updated index.md with all new components

bUnit Tests (6 new test files, 104 tests):
- TextBoxWatermarkExtender, DropShadowExtender, PasswordStrength
- ValidatorCalloutExtender, ListSearchExtender, BalloonPopupExtender

Migration Toolkit:
- Updated AJAX-TOOLKIT.md with migration patterns for all 12 extenders

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

* fix: Set correct ACT defaults for HoverMenuExtender (HoverDelay=300, PopDelay=100)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Updated status from Draft to Approved for issue #439.
Links PRD to GitHub issue for tracking.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-16-prd-review
Requested by: Jeffrey T. Fritz

Changes:
- Logged orchestration: Forge reviewed Component Health Dashboard PRD
- Logged session: PRD review findings (3 errata items identified)
- Merged decision inbox: forge-prd-439-review.md → decisions.md
- Propagated cross-agent update to Cyclops history.md
- No archival needed (decisions.md = 11.8 KB)
…e captured

Session: 2026-03-16T13:35:00Z-prd-bugfix
Requested by: Jeffrey T. Fritz

Changes:
- Logged orchestration for Forge PRD bug fix (3 bugs resolved)
- Created session log for PRD bugfix session
- Merged empty decision inbox (no new decisions)
- Appended Playwright directive to Colossus history (HTML Fidelity dimension unblocked)
- Created decisions-archive.md template for future archiving cycles
Session: 2026-03-16-msbuild-verification
Requested by: Jeffrey T. Fritz

Changes:
- Added orchestration log: coordinator MSBuild verification
- Added session log: msbuild-verification summary
- Merged decision: MSBuild 18.5.0.12604 verified for .NET 4.8 WebForms compilation
- Updated Forge history: Cross-agent notification that reflection tool is viable
…ation

Session: 2026-03-16T06-58-13Z-prd-decomposition
Requested by: Scribe

Changes:
- Created orchestration-log entry for Forge PRD decomposition task
- Created session-log documenting 12 work items and dependency chain
- Merged forge-prd-decomposition.md inbox into decisions.md
- Archived pre-2026-03-14 decisions to decisions-archive.md
- Appended PRD decomposition team update to 5 agent history files (Cyclops, Rogue, Jubilee, Beast, Colossus)
- Deleted merged inbox file

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-16-dashboard-build-wave1
Requested by: Jeffrey T. Fritz

Changes:
- Merged 2 copilot directives from decisions/inbox/ into decisions.md
- Directive 1: No reflection tool needed (use MSDN docs instead)
- Directive 2: Playwright IS installed (HTML Fidelity unblocked)
- Created session log for dashboard build Wave 1 launch
- Deleted merged inbox files
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(dashboard): Wave 1 — health service, baselines, counting tests (#439)

Component Health Dashboard foundation:
- ComponentHealthService with hierarchy-walking property/event counter (§5.4)
- File detection for tests, docs, and samples (§7.4)
- Weighted scoring engine with missing-baseline handling (§4.1/§4.4)
- AddComponentHealthDashboard() DI extension
- reference-baselines.json: 61 components curated from MSDN docs
- tracked-components.json: 61 component-to-WebForms type mappings
- 39 counting verification tests (all passing)
- PRD §3.2 updated: MSDN is sole baseline source (no reflection tool)

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

* feat(dashboard): Wave 2 — dashboard page, docs, ComponentCatalog (#439)

Dashboard UI and documentation:
- /dashboard Razor page with category-grouped health tables
- Worst-first sorting, color-coded scores (green/yellow/red)
- Fraction display for props/events, binary indicators for tests/docs/samples
- Category/status filtering, sort options, show/hide deferred toggle
- Registered in ComponentCatalog under "Diagnostics" category
- AddComponentHealthDashboard() wired in Program.cs
- docs/dashboard.md: scoring model, reading guide, counting rules
- Added to mkdocs.yml navigation

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

* docs(ai-team): merge decision inbox

Session: 2026-03-16-scribe-merge
Requested by: Scribe

Changes:
- Merged 5 decisions from inbox into decisions.md
- Deleted inbox source files after merge

* docs(ai-team): merge Forge review + Wave 2 results

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

* fix(dashboard): add status fields to tracked-components.json (#439)

Substitution → Deferred, Xml → Deferred, ScriptManager → Stub.
Added Xml to DefaultTrackedComponents fallback dictionary.
Fixes Forge review finding #10.

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

* refactor(docs): update Executive Summary for clarity and structure

* feat(dashboard): move health dashboard button to hero section

Move Component Health Dashboard link from catalog grid to hero section
as a button next to 'View on GitHub' and 'Get Started'. Remove the
separate Diagnostics catalog entry from ComponentCatalog.cs.

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

* fix: L1 script bug fixes + 5 new test cases for #472

Fix 3 bugs in bwfc-migrate.ps1:
- Scope Eval() regex in GetRouteUrl to avoid corrupting data-binding expressions
- Use horizontal whitespace only in ContentWrapper regex to preserve indentation
- Check for TItem= in ItemType fallback lookahead to prevent duplicates

Add test cases TC11-TC15 covering all five #472 patterns:
- TC11: Bool/enum/unit normalization
- TC12: DataSourceID removal + data source control replacement
- TC13: Response.Redirect -> NavigationManager.NavigateTo
- TC14: Session[key] detection with migration guidance
- TC15: ViewState[key] detection with field suggestions

Extend Run-L1Tests.ps1 to verify code-behind (.razor.cs) output.

Test suite: 7/10 (70%) -> 15/15 (100%), line accuracy: 94.3% -> 100%

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

* fix(#471): Replace GUID-based IDs with developer-provided ClientID

CheckBox, RadioButton: Use ClientID directly for input id/label for
attributes. When no ID is set, omit id/for (no GUID pollution).

RadioButton: Keep GUID fallback only for radio group name attribute
(required for mutual exclusion behavior), not for input id.

RadioButtonList: GetInputId returns ClientID_N suffixes when ID is set,
null when not set. Group name retains GUID fallback for radio behavior.

FileUpload: Already correct - only renders id when ClientID is present.

Updated 7 tests to match new behavior: without developer ID, no id/for
attributes are rendered. Tests with developer ID verify exact ID values.

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

* docs: Update Cyclops history and decision for #471 GUID ID fix

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

* docs(ai-team): Merged decisions #471 #472; 2105 tests pass

Session: 2026-03-17-issues-471-472
Requested by: Jeffrey T. Fritz

Changes:
- Logged Cyclops #471/#472 fixes (GUID IDs, L1 script)
- Logged Rogue GUID ID test coverage (11 bUnit tests)
- Merged 4 inbox decisions to decisions.md
- Deleted inbox files after merge
- Appended team updates to Cyclops, Rogue, Colossus, Beast history.md
- Created orchestration logs per agent
- Created session log

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs(squad): Merge HttpHandler decisions + session logs + agent updates

Session: 2026-03-17T14-50-00Z-httphandler-impl
Requested by: Jeff Fritz

Changes:
- Merged Forge's Architecture Proposal (56KB) and Cyclops's Implementation Decisions (5KB) from decisions/inbox/ to decisions.md
- Created orchestration logs for Cyclops and Beast agent spawns
- Created session log: 2026-03-17T14-50-00Z-httphandler-impl.md
- Updated agent history files (cyclops, beast, rogue) with cross-team updates
- Deleted 2 merged inbox files
- decisions.md now ~655KB (deferred archival for next run)

Team sync: HttpHandlerBase (7 files, 0 build errors) + Migrating .ashx Handlers docs (800 lines) both shipped. Rogue's test suite in progress.

* feat: Add HttpHandlerBase for .ashx handler migration (#473)

Implementation (7 files):
- HttpHandlerBase: abstract base with ProcessRequestAsync + IsReusable
- HttpHandlerContext/Request/Response/Server: adapter classes wrapping HttpContext
- RequiresSessionStateAttribute: marker for session pre-load
- HandlerEndpointExtensions: MapHandler<T> returning IEndpointConventionBuilder

Tests (5 files, 94 tests passing):
- HandlerEndpointExtensionTests, HttpHandlerContextTests
- HttpHandlerRequestTests, HttpHandlerResponseTests, HttpHandlerServerTests

Documentation:
- MigratingAshxHandlers.md: 800-line migration guide with API mapping + examples
- mkdocs.yml nav entry added

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

* docs(ai-team): Session log + orchestration log for Rogue test validation

Session: 2026-03-17T15-26-00Z-httphandler-validation
Requested by: Orchestrator (continuation)

Changes:
- Orchestration log for Rogue's handler test validation (94 tests passing, 1 fix applied)
- Session log documenting validation completion and verification
- Cross-agent update appended to Rogue history: implementation validation done
- Cross-agent update appended to Cyclops history: handler tests verified Cyclops' implementation

* fix: Remove client-side demo from Build Demo Sites workflow

The AfterBlazorClientSide (WebAssembly) project is not being deployed
anywhere. Its build was failing with NETSDK1082 (no runtime pack for
browser-wasm on .NET 10). Remove the restore, publish, and artifact
upload steps for the client-side demo.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@github-advanced-security github-advanced-security AI left a comment

Choose a reason for hiding this comment

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

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

csharpfritz and others added 2 commits March 17, 2026 09:14
Merged upstream/main into dev to resolve merge conflicts in PR #475.
Conflicts were in .ai-team/ history files, .squad/ state files,
BlazorMeetsWebForms.sln, and dev-docs analysis files. All append-only
files preserve content from both branches. Source code conflicts in
WebFormsPageBase, DataBoundComponent, ListView, FormView, ButtonBase,
LoginView, SelectHandler, and ServiceCollectionExtensions resolved to
keep dev features while incorporating main's additional overloads and
event aliases.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
csharpfritz and others added 6 commits March 17, 2026 09:16
Session: 2026-03-17-merge-resolution
Orchestration: Forge (Lead)

Changes:
- Orchestration log: 2026-03-17T16-03-00Z-forge.md
- Session log: 2026-03-17T16-03-00Z-merge-resolution.md
- ~370 conflicts resolved across .ai-team/, .squad/, .sln, dev-docs, and source files
- Build verified clean
- Pushed to upstream/dev and origin/dev
Fixed CS1503 (EventCallback method group) in ImageButton/Index.razor,
GridView/Selection.razor and CS0103 (missing method) in
FormView/Simple.razor, FormView/Edit.razor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-17T16-18-00Z-sample-fixes
Requested by: Scribe

Changes:
- Logged Cyclops spawn fixing 4 sample compilation errors
- Recorded ImageButton and GridView EventCallback signature fixes
- Documented FormView PageIndexChanging method stubs
- Verified build clean and CI re-running
…ents

Repeater now has 6 EventCallback parameters (ItemCommand, ItemCreated,
ItemDataBound + On* variants) and GridView has 30 events after row
editing/deleting/updating operations were added. Updated test assertions
to reflect the actual component state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Six sample pages referenced a <Nav /> component that doesn't exist in
their folder (ChangePassword, CreateUserWizard, DataPager, Localize,
LoginView, MultiView). This caused RZ10012 warnings and 500 errors
when navigating to LoginView in Playwright tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
AuthorizeView requires CascadingAuthenticationState to be registered.
Without it, the LoginView sample page crashes with a 500 error because
it can't resolve the authentication state cascading parameter.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@csharpfritz csharpfritz merged commit 6ea7b25 into main Mar 17, 2026
9 of 10 checks passed
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.

3 participants