[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-migrating-aspnet-framework-to-core":3,"mdc--uzxg32-key":35,"related-repo-microsoft-migrating-aspnet-framework-to-core":3317,"related-org-microsoft-migrating-aspnet-framework-to-core":3408},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":33,"mdContent":34},"migrating-aspnet-framework-to-core","migrate ASP.NET Framework to Core","Orchestrates migration of ASP.NET Framework (System.Web) MVC and WebAPI projects to ASP.NET Core. Covers only old .NET Framework web projects — not applicable to ASP.NET Core or modern .NET web projects (those are already on the target stack). Defines the ordered phase sequence (project file, host, config, DI, controllers, middleware, auth, views, cleanup), satellite skill dispatch, and migration unit breakdown for both in-place and side-by-side modes. Use when executing a task that upgrades a project with System.Web dependencies, HttpModules, HttpHandlers, MVC controllers, WebAPI controllers, or Global.asax. Also triggers for \"migrate ASP.NET to Core\", \"upgrade MVC project\", \"convert WebAPI to ASP.NET Core\". Not applicable to class libraries unless they directly reference System.Web.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Backend","backend","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"ASP.NET Core","asp-net-core",{"name":23,"slug":24,"type":15},"Migration","migration",7,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins","2026-07-03T16:30:55.581898",null,1,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":28},[],"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fupgrade-agent\u002Fextenders\u002Fupgrade-dotnet\u002Fupgrade\u002Fskills\u002Flazy\u002Fweb\u002Fmvc\u002Fmigrating-aspnet-framework-to-core","---\r\nname: migrating-aspnet-framework-to-core\r\ndescription: >\r\n  Orchestrates migration of ASP.NET Framework (System.Web) MVC and WebAPI projects\r\n  to ASP.NET Core. Covers only old .NET Framework web projects — not applicable to\r\n  ASP.NET Core or modern .NET web projects (those are already on the target stack).\r\n  Defines the ordered phase sequence (project file, host, config, DI, controllers,\r\n  middleware, auth, views, cleanup), satellite skill dispatch, and migration unit\r\n  breakdown for both in-place and side-by-side modes. Use when executing a task that\r\n  upgrades a project with System.Web dependencies, HttpModules, HttpHandlers, MVC\r\n  controllers, WebAPI controllers, or Global.asax. Also triggers for \"migrate ASP.NET\r\n  to Core\", \"upgrade MVC project\", \"convert WebAPI to ASP.NET Core\". Not applicable\r\n  to class libraries unless they directly reference System.Web.\r\nmetadata:\r\n  discovery: lazy\r\n  traits: .NET|CSharp|VisualBasic|DotNetCore\r\n---\r\n\r\n# ASP.NET Framework → ASP.NET Core Migration\r\n\r\n## ⛔ Read This First\r\n\r\nThis skill defines **how to execute** a web project migration task:\r\n- The migration steps and gates between them\r\n- Which satellite skills to load and when\r\n- Links to mode-specific guidance for task boundaries\r\n\r\nIt does not define which projects to migrate or in what order across the solution —\r\nthat is the strategy's responsibility.\r\n\r\n**Do not mention internal step names (like \"Phase 5\") in chat.** Describe the work\r\nin plain language: \"migrating controllers\", \"setting up configuration\", etc.\r\n\r\n**Two modes** depending on the Project Approach upgrade option:\r\n\r\n| Project Approach | Mode | Guidance |\r\n|-----------------|------|----------|\r\n| In-place rewrite | **In-Place** | Execute all steps sequentially within one task |\r\n| Side-by-side | **Side-by-Side** | Load [side-by-side.md](side-by-side.md) for scaffold\u002Fmigrate task boundaries |\r\n\r\nDetermine mode from `scenario-instructions.md` (Upgrade Options > Project Approach) before proceeding.\r\n\r\n---\r\n\r\n## Satellite Skill Loading Guide\r\n\r\nThis migration touches many complex feature areas. Each has a dedicated satellite skill\r\nwith depth this orchestrator does not repeat. Load satellites **just before** the phase\r\nthat needs them — not all upfront.\r\n\r\n### When to Load Which Satellite\r\n\r\n| Assessment Signal | Satellite Skill | Load Before |\r\n|-------------------|----------------|-------------|\r\n| `UsesHttpModules`, `UsesHttpHandlers`, `UsesGlobalAsax` | `migrating-global-asax`, `migrating-mvc-http-pipeline` | Middleware migration |\r\n| `UsesHttpContextCurrent`, `UsesHttpServerUtility` | `migrating-mvc-httpcontext` | DI container setup |\r\n| `UsesFormsAuth`, `UsesMembership`, `UsesWindowsAuth`, `UsesOwinAuth`, `UsesOAuthMiddleware` | `migrating-mvc-authentication` | Authentication migration |\r\n| `UsesOwin`, `UsesKatana`, `UsesAppBuilder` | `migrating-owin-to-aspnet-core` | Middleware migration |\r\n| `UsesSession`, `UsesTempData`, `UsesApplicationState` | `migrating-mvc-session-state` | DI container setup |\r\n| `UsesCustomDependencyResolver`, `UsesAutofac`, `UsesUnity`, `UsesNinject`, `UsesCastleWindsor` | `migrating-mvc-dependency-injection` | DI container setup |\r\n| `UsesAttributeRouting`, `UsesRouteConstraints`, `UsesAreaRouting` | `migrating-mvc-routing` | Controller migration |\r\n| `UsesWebApiControllers`, `UsesHttpResponseMessage`, `UsesContentNegotiation`, `UsesCustomFormatters` | `migrating-mvc-controllers`, `migrating-mvc-content-negotiation` | Controller migration |\r\n| `UsesMvcControllers`, `UsesChildActions`, `UsesHtmlHelpers` | `migrating-mvc-controllers` | Controller migration |\r\n| `UsesCustomFilters`, `UsesOutputCache`, `UsesHandleError` | `migrating-mvc-filters` | Controller migration |\r\n| `UsesCustomModelBinders`, `UsesFromUri`, `UsesValueProviders` | `migrating-mvc-model-binding` | Controller migration |\r\n| `UsesMvcViews`, `UsesBundling`, `UsesHtmlHelpers`, `UsesChildActions` | `migrating-mvc-razor-views` | Views migration |\r\n\r\n### Loading Rules\r\n\r\n1. **During baseline capture** — inventory which satellites will be needed\r\n   for this project and note them. Do not load them yet.\r\n2. **Load satellite just before the step that needs it** — not all upfront. Token\r\n   budget matters; load only what the current step requires.\r\n3. **If a satellite is not available** — proceed with caution, note the gap, apply\r\n   general knowledge, and flag areas requiring manual review.\r\n4. **Multiple satellites may apply to the same step** — load all relevant ones before\r\n   starting that step.\r\n\r\n---\r\n\r\n## Migration Steps\r\n\r\nThese steps apply to both modes. In-place executes them sequentially.\r\nSide-by-side splits them across tasks — see [side-by-side.md](side-by-side.md).\r\n\r\n---\r\n\r\n### Baseline Capture\r\n\r\nBefore any changes, record:\r\n\r\n**Endpoint inventory** (becomes acceptance checklist for final verification):\r\n- All routes and HTTP methods\r\n- Expected response shapes and status codes per endpoint\r\n- Authentication\u002Fauthorization rules per endpoint\r\n- Custom HTTP headers set by the application\r\n\r\n**Pipeline inventory** (drives middleware migration):\r\n- All `HttpModule` registrations and their pipeline event hooks, in order\r\n- All `HttpHandler` and `IHttpAsyncHandler` registrations\r\n- All `Global.asax` event handlers in use\r\n\r\n**Feature inventory** (determines satellite loading):\r\n- Review assessment signals and note which satellites from the loading guide above apply\r\n- Flag any `HttpContext.Current` \u002F `ClaimsPrincipal.Current` static access patterns\r\n- Flag any third-party DI container in use\r\n- Flag session, TempData, or application state usage\r\n- Flag any OWIN\u002FKatana middleware\r\n\r\n**Gate**: Baseline document exists. Satellite list noted. No proceeding until complete —\r\nthis document is the acceptance oracle for final verification.\r\n\r\n---\r\n\r\n### Project File and SDK\r\n\r\n- Replace legacy `.csproj` format with SDK-style format\r\n- Set `\u003CTargetFramework>` to target version\r\n- Remove `packages.config` — migrate all references to `\u003CPackageReference>`\r\n- Remove web-specific MSBuild imports (`Microsoft.WebApplication.targets`, etc.)\r\n- Remove `System.Web` assembly references from project file\r\n- Verify no orphaned references remain\r\n\r\n**Gate**: Project loads in IDE without errors. No compilation required yet.\r\n\r\n---\r\n\r\n### Entry Point and Host\r\n\r\n- Create `Program.cs` with minimal `WebApplication` host — no features, stub only\r\n- Wire `app.MapGet(\"\u002Fhealth\", () => \"ok\")` as a smoke test endpoint\r\n- Verify: `dotnet build` succeeds, `dotnet run` starts, stub endpoint returns 200\r\n\r\n**Gate**: App starts and responds. This is the \"green field confirmed\" gate.\r\nDo not add any features until this is green — a broken host wastes all subsequent work.\r\n\r\n---\r\n\r\n### Configuration\r\n\r\n- Migrate `Web.config` `\u003CappSettings>` → `appsettings.json`\r\n- Migrate `Web.config` `\u003CconnectionStrings>` → `appsettings.json` connection strings section\r\n- Wire `IConfiguration` in `Program.cs`\r\n- Replace all `ConfigurationManager.AppSettings[\"key\"]` calls with `IConfiguration[\"key\"]`\r\n- Replace all `ConfigurationManager.ConnectionStrings[\"name\"]` with `IConfiguration.GetConnectionString(\"name\")`\r\n- Migrate environment-specific transforms (`Web.Debug.config`) → `appsettings.Development.json`\r\n- Move secrets (passwords, API keys) out of config files → User Secrets (dev) or environment variables\r\n\r\n**Gate**: All configuration keys accessible via `IConfiguration`.\r\nNo `ConfigurationManager` references remain in non-legacy code.\r\n\r\n**Note**: Do not migrate authentication configuration here — that belongs to the\r\nauthentication migration step.\r\nConnection strings are config, auth settings are not.\r\n\r\n> **If** assessment signals include `UsesCustomConfigSections`, `UsesEncryptedConfig`,\r\n> or `UsesConfigTransforms` beyond simple appSettings → flag for manual review.\r\n> Custom config section types have no direct equivalent and require IOptions\u003CT> redesign.\r\n\r\n---\r\n\r\n### Dependency Injection Container\r\n\r\n> **Load satellites before this phase**:\r\n> - `migrating-mvc-dependency-injection` if any of: `UsesAutofac`, `UsesUnity`, `UsesNinject`,\r\n>   `UsesCastleWindsor`, `UsesCustomDependencyResolver`\r\n> - `migrating-mvc-httpcontext` if: `UsesHttpContextCurrent`, `UsesHttpServerUtility`\r\n> - `migrating-mvc-session-state` if: `UsesSession`, `UsesApplicationState`\r\n\r\n- Register all application services in `Program.cs` or extension methods\r\n- Replace `DependencyResolver.SetResolver` (MVC) or `config.DependencyResolver` (WebAPI)\r\n  with `builder.Services` registrations\r\n- Register `DbContext`, repositories, application services\r\n- Add `IHttpContextAccessor` registration if `HttpContext.Current` usage was found during baseline capture\r\n- Register session services if session usage was found (`builder.Services.AddSession()`)\r\n- Do not implement services that still have `System.Web` dependencies — stub them with\r\n  `NotImplementedException` and a TODO comment, resolve during controller migration\r\n\r\n**Lifetime mapping**:\r\n| Old | New |\r\n|-----|-----|\r\n| Per-request \u002F `InstancePerRequest` | `Scoped` |\r\n| Singleton | `Singleton` |\r\n| Transient \u002F `InstancePerDependency` | `Transient` |\r\n\r\n**Gate**: Application starts and DI container resolves without errors.\r\nAll services registered (stubs acceptable for System.Web-dependent ones).\r\n\r\n---\r\n\r\n### Controllers and Action Results\r\n\r\n> **Load satellites before this phase**:\r\n> - `migrating-mvc-routing` if: `UsesAttributeRouting`, `UsesRouteConstraints`, `UsesAreaRouting`\r\n> - `migrating-mvc-controllers` if: `UsesWebApiControllers`, `UsesHttpResponseMessage`\r\n> - `migrating-mvc-controllers` if: `UsesMvcControllers`, `UsesChildActions`\r\n> - `migrating-mvc-filters` if: `UsesCustomFilters`, `UsesOutputCache`, `UsesHandleError`\r\n> - `migrating-mvc-model-binding` if: `UsesCustomModelBinders`, `UsesFromUri`\r\n\r\n> **In Side-by-Side mode**: This phase is the repeating migration unit.\r\n> Each unit = one controller group (by feature area) + associated filters + models.\r\n> Complete and validate each unit before starting the next.\r\n> See Mode Reference section for unit ordering guidance.\r\n>\r\n> **Controller triage** (before creating units): Read each controller file to\r\n> assess complexity — constructor dependencies, auth requirements, action count,\r\n> use of complex features (child actions, custom filters, model binders), and\r\n> any other signals that indicate migration difficulty. Group by feature area\r\n> (folders, naming, areas). Order: simplest first, auth-dependent last.\r\n> Complex controllers with many dependencies should be their own unit.\r\n>\r\n> **Per-unit dependency discovery** (when starting each unit): Use\r\n> `get_code_dependencies` on the controller(s) in the current unit to discover\r\n> explicit code dependencies — services, models, views, packages. Then also\r\n> check for **implicit dependencies** not visible in the code graph:\r\n> - Review baseline capture: which HTTP modules, handlers, or Global.asax\r\n>   events affect this controller's endpoints?\r\n> - Check for `HttpContext.Current`, `ConfigurationManager`, or static helper\r\n>   usage that won't work in Core without explicit registration\r\n> - Check `RouteConfig.cs` \u002F `WebApiConfig.cs` for non-attribute routes that\r\n>   serve this controller\r\n> - Check `FilterConfig.cs` for global filters this controller depends on\r\n>\r\n> Verify each dependency is ready in the new project:\r\n> - DI: are the controller's injected services registered? Replace stubs if needed.\r\n> - Config: are the config keys the controller reads present in `appsettings.json`?\r\n> - References: can the new project reference the class libraries this controller uses?\r\n> - Routes: is `app.MapControllers()` in the pipeline? Are non-attribute routes configured?\r\n> - Pipeline: are HTTP modules this controller depends on replicated as middleware?\r\n>\r\n> Fix any gaps before porting the controller code. Document in task.md.\r\n\r\n**For each controller:**\r\n- Change namespace from `System.Web.Mvc` or `System.Web.Http` to `Microsoft.AspNetCore.Mvc`\r\n- MVC: keep `Controller` base class\r\n- WebAPI: switch from `ApiController` to `ControllerBase`\r\n- Apply `[ApiController]` attribute if pure API (no views) — understand its behavior\r\n  changes before applying (auto-400, binding inference)\r\n- Migrate route attributes — consult `migrating-mvc-routing` satellite for combining rules\r\n- Migrate return types — consult `migrating-mvc-controllers` for WebAPI specifics\r\n- Migrate binding source attributes (`[FromUri]` → `[FromQuery]`\u002F`[FromRoute]`)\r\n- Migrate associated filters — consult `migrating-mvc-filters` satellite\r\n- Remove `AreaRegistration` classes — keep area folder structure, registration is now automatic\r\n\r\n**Gate (per unit in side-by-side)**: Unit builds, all endpoints in unit return expected\r\nstatus codes per baseline, unit tests pass.\r\n\r\n**Gate (in-place)**: All controllers migrated, solution builds, all endpoints respond\r\nper baseline.\r\n\r\n---\r\n\r\n### Middleware Pipeline\r\n\r\n> **Load satellites before this phase**:\r\n> - `migrating-global-asax`, `migrating-mvc-http-pipeline` if: `UsesHttpModules`, `UsesHttpHandlers`, `UsesGlobalAsax`\r\n> - `migrating-owin-to-aspnet-core` if: `UsesOwin`, `UsesKatana`\r\n\r\n**Pipeline ordering is the critical concern here.** Reconstruct from baseline inventory.\r\n\r\nHigh-level mapping reference:\r\n\r\n| Old construct | Core equivalent |\r\n|---------------|----------------|\r\n| `IHttpModule.BeginRequest` | Middleware registered before `next()` |\r\n| `IHttpModule.EndRequest` | Middleware registered after `next()` |\r\n| `IHttpModule.AuthenticateRequest` | Auth middleware — position relative to `UseAuthentication()` |\r\n| `IHttpHandler` | Minimal API endpoint or terminal middleware |\r\n| `IHttpAsyncHandler` | Async terminal middleware |\r\n| `Global.asax Application_Start` | `Program.cs` startup code |\r\n| `Global.asax Application_End` | `IHostApplicationLifetime.ApplicationStopping` |\r\n| `Global.asax Application_Error` | Exception handling middleware |\r\n| `DelegatingHandler` (WebAPI) | Middleware — position in pipeline must match original handler order |\r\n\r\n> For anything beyond basic module-to-middleware mapping, consult `migrating-mvc-http-pipeline`.\r\n> Pipeline ordering errors produce subtle bugs that are difficult to diagnose.\r\n\r\n**Gate**: Application pipeline behaves equivalently to baseline for\r\nnon-authenticated requests. All custom middleware registered in correct order.\r\n\r\n---\r\n\r\n### Authentication and Authorization\r\n\r\n> **Load satellite before this phase**:\r\n> - `migrating-mvc-authentication` — always load for this phase when any auth is present.\r\n>   Auth is security-critical and has multiple distinct migration paths.\r\n>   Do not proceed based on general knowledge alone.\r\n\r\n> Execute this step after the pipeline is stable (middleware migration complete).\r\n> Auth is the hardest to debug when the pipeline is uncertain.\r\n\r\nHigh-level path selection (satellite provides full detail for each):\r\n\r\n| Detected auth mechanism | Migration path |\r\n|------------------------|----------------|\r\n| `FormsAuthentication` | Cookie authentication middleware |\r\n| `SqlMembership` \u002F `SimpleMembership` | ASP.NET Core Identity (schema migration required) |\r\n| Custom `MembershipProvider` | Custom `IUserStore\u003CT>` or `IAuthenticationHandler` |\r\n| Windows Authentication | Negotiate middleware |\r\n| OWIN OAuth \u002F token server | IdentityServer \u002F Duende \u002F OpenIddict |\r\n| Custom `IPrincipal` \u002F claims | `IClaimsTransformation` |\r\n| `Web.config \u003Cauthorization>` rules | Policy-based authorization |\r\n\r\n**Gate**: Authenticated and unauthenticated request flows match baseline.\r\nRun the full auth rules inventory from baseline capture as acceptance checklist.\r\n\r\n---\r\n\r\n### Views and Static Assets (MVC projects only)\r\n\r\n> **Load satellite before this phase**:\r\n> - `migrating-mvc-razor-views` if: `UsesMvcViews`, `UsesBundling`, `UsesHtmlHelpers`,\r\n>   `UsesChildActions`, `UsesDisplayTemplates`, `UsesEditorTemplates`\r\n\r\nHigh-level checklist (satellite provides full detail):\r\n\r\n- Remove `@Scripts.Render` \u002F `@Styles.Render` calls — no built-in equivalent\r\n- Replace common `HtmlHelper` calls with Tag Helpers (`Html.ActionLink` → `\u003Ca asp-*>`, etc.)\r\n- Convert child actions (`Html.Action()`) to View Components\r\n- Convert `@helper` Razor helpers to partial views or Tag Helpers\r\n- Move static files from `Content\u002F` and `Scripts\u002F` to `wwwroot\u002F`\r\n- Add `app.UseStaticFiles()` to `Program.cs`\r\n- Choose and configure bundling approach (WebOptimizer, npm pipeline, or direct references)\r\n- Add `_ViewImports.cshtml` with Tag Helper namespace imports\r\n- Verify `_ViewStart.cshtml` layout reference is correct\r\n\r\n**Gate**: All views render without errors. Static assets load. No `@Scripts.Render`\r\nor `@Styles.Render` references remain.\r\n\r\n---\r\n\r\n### Cleanup and Verification\r\n\r\n- Remove all `#if NETFRAMEWORK` conditional blocks\r\n- Remove remaining `System.Web` references if any remain (there should be none)\r\n- Remove `WebApiConfig.cs`, `RouteConfig.cs`, `FilterConfig.cs`, `BundleConfig.cs`\r\n  from old project's code that was copied to new project\r\n- Remove `packages.config` if not already done\r\n- Remove unused compatibility shims or adapter layers added during migration\r\n\r\n> **Do NOT delete the old Framework project.** In side-by-side mode, the old\r\n> project stays in the solution. Physical removal is a post-upgrade step for\r\n> the user. In in-place mode, this section cleans up the converted project.\r\n\r\n**Verify against baseline**:\r\n- [ ] All endpoints return expected status codes\r\n- [ ] Authentication flows work end to end (each auth rule from baseline)\r\n- [ ] All configuration values load correctly\r\n- [ ] No `System.Web` references remain (`dotnet list package` confirms)\r\n- [ ] Solution builds with 0 errors and 0 migration-related warnings\r\n- [ ] All tests pass\r\n- [ ] Static assets load (MVC projects)\r\n\r\n---\r\n\r\n## Library Dependencies With System.Web References\r\n\r\nIf the task scope includes class libraries that reference `System.Web`:\r\n\r\n- Apply config, DI, controllers, middleware, auth steps only — no project setup, no views\r\n- Primary concern: replace `System.Web` API surface with abstractions injectable via DI\r\n- Migrate before the web project that consumes them — they must be clean before controller migration\r\n- Common patterns requiring architectural discussion (not just API swap):\r\n  - `HttpContext.Current` in a library — load `migrating-mvc-httpcontext` satellite\r\n  - `HttpServerUtility` usage — no direct equivalent, method-by-method replacement needed\r\n  - Static auth access (`HttpContext.Current.User`) — requires `IHttpContextAccessor` threading care\r\n\r\n---\r\n\r\n## Mode Reference\r\n\r\n### In-Place Mode\r\n\r\nAll migration steps execute sequentially within a single project upgrade task.\r\nNo task boundaries between steps.\r\n\r\n### Side-by-Side Mode (Project Approach = Side-by-side)\r\n\r\n**Load [side-by-side.md](side-by-side.md)** for the complete scaffold\u002Fmigrate\r\ntask structure, scaffold checklist, and controller migration subtask ordering.\r\nOld project is not deleted — removal is a post-upgrade step for the user.\r\n",{"data":36,"body":40},{"name":4,"description":6,"metadata":37},{"discovery":38,"traits":39},"lazy",".NET|CSharp|VisualBasic|DotNetCore",{"type":41,"children":42},"root",[43,52,59,73,93,98,108,118,201,215,219,225,237,244,791,797,841,844,850,861,864,870,875,885,908,918,966,976,1020,1030,1033,1039,1117,1126,1129,1135,1193,1202,1205,1211,1343,1367,1377,1420,1423,1429,1526,1635,1644,1728,1737,1740,1746,1872,2031,2039,2188,2198,2208,2211,2217,2283,2293,2298,2500,2515,2524,2527,2533,2558,2566,2571,2734,2743,2746,2752,2812,2817,2963,2986,2989,2995,3069,3082,3091,3178,3181,3187,3198,3278,3281,3287,3293,3298,3304],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"aspnet-framework-aspnet-core-migration",[49],{"type":50,"value":51},"text","ASP.NET Framework → ASP.NET Core Migration",{"type":44,"tag":53,"props":54,"children":56},"h2",{"id":55},"read-this-first",[57],{"type":50,"value":58},"⛔ Read This First",{"type":44,"tag":60,"props":61,"children":62},"p",{},[63,65,71],{"type":50,"value":64},"This skill defines ",{"type":44,"tag":66,"props":67,"children":68},"strong",{},[69],{"type":50,"value":70},"how to execute",{"type":50,"value":72}," a web project migration task:",{"type":44,"tag":74,"props":75,"children":76},"ul",{},[77,83,88],{"type":44,"tag":78,"props":79,"children":80},"li",{},[81],{"type":50,"value":82},"The migration steps and gates between them",{"type":44,"tag":78,"props":84,"children":85},{},[86],{"type":50,"value":87},"Which satellite skills to load and when",{"type":44,"tag":78,"props":89,"children":90},{},[91],{"type":50,"value":92},"Links to mode-specific guidance for task boundaries",{"type":44,"tag":60,"props":94,"children":95},{},[96],{"type":50,"value":97},"It does not define which projects to migrate or in what order across the solution —\nthat is the strategy's responsibility.",{"type":44,"tag":60,"props":99,"children":100},{},[101,106],{"type":44,"tag":66,"props":102,"children":103},{},[104],{"type":50,"value":105},"Do not mention internal step names (like \"Phase 5\") in chat.",{"type":50,"value":107}," Describe the work\nin plain language: \"migrating controllers\", \"setting up configuration\", etc.",{"type":44,"tag":60,"props":109,"children":110},{},[111,116],{"type":44,"tag":66,"props":112,"children":113},{},[114],{"type":50,"value":115},"Two modes",{"type":50,"value":117}," depending on the Project Approach upgrade option:",{"type":44,"tag":119,"props":120,"children":121},"table",{},[122,146],{"type":44,"tag":123,"props":124,"children":125},"thead",{},[126],{"type":44,"tag":127,"props":128,"children":129},"tr",{},[130,136,141],{"type":44,"tag":131,"props":132,"children":133},"th",{},[134],{"type":50,"value":135},"Project Approach",{"type":44,"tag":131,"props":137,"children":138},{},[139],{"type":50,"value":140},"Mode",{"type":44,"tag":131,"props":142,"children":143},{},[144],{"type":50,"value":145},"Guidance",{"type":44,"tag":147,"props":148,"children":149},"tbody",{},[150,172],{"type":44,"tag":127,"props":151,"children":152},{},[153,159,167],{"type":44,"tag":154,"props":155,"children":156},"td",{},[157],{"type":50,"value":158},"In-place rewrite",{"type":44,"tag":154,"props":160,"children":161},{},[162],{"type":44,"tag":66,"props":163,"children":164},{},[165],{"type":50,"value":166},"In-Place",{"type":44,"tag":154,"props":168,"children":169},{},[170],{"type":50,"value":171},"Execute all steps sequentially within one task",{"type":44,"tag":127,"props":173,"children":174},{},[175,180,188],{"type":44,"tag":154,"props":176,"children":177},{},[178],{"type":50,"value":179},"Side-by-side",{"type":44,"tag":154,"props":181,"children":182},{},[183],{"type":44,"tag":66,"props":184,"children":185},{},[186],{"type":50,"value":187},"Side-by-Side",{"type":44,"tag":154,"props":189,"children":190},{},[191,193,199],{"type":50,"value":192},"Load ",{"type":44,"tag":194,"props":195,"children":197},"a",{"href":196},"side-by-side.md",[198],{"type":50,"value":196},{"type":50,"value":200}," for scaffold\u002Fmigrate task boundaries",{"type":44,"tag":60,"props":202,"children":203},{},[204,206,213],{"type":50,"value":205},"Determine mode from ",{"type":44,"tag":207,"props":208,"children":210},"code",{"className":209},[],[211],{"type":50,"value":212},"scenario-instructions.md",{"type":50,"value":214}," (Upgrade Options > Project Approach) before proceeding.",{"type":44,"tag":216,"props":217,"children":218},"hr",{},[],{"type":44,"tag":53,"props":220,"children":222},{"id":221},"satellite-skill-loading-guide",[223],{"type":50,"value":224},"Satellite Skill Loading Guide",{"type":44,"tag":60,"props":226,"children":227},{},[228,230,235],{"type":50,"value":229},"This migration touches many complex feature areas. Each has a dedicated satellite skill\nwith depth this orchestrator does not repeat. Load satellites ",{"type":44,"tag":66,"props":231,"children":232},{},[233],{"type":50,"value":234},"just before",{"type":50,"value":236}," the phase\nthat needs them — not all upfront.",{"type":44,"tag":238,"props":239,"children":241},"h3",{"id":240},"when-to-load-which-satellite",[242],{"type":50,"value":243},"When to Load Which Satellite",{"type":44,"tag":119,"props":245,"children":246},{},[247,268],{"type":44,"tag":123,"props":248,"children":249},{},[250],{"type":44,"tag":127,"props":251,"children":252},{},[253,258,263],{"type":44,"tag":131,"props":254,"children":255},{},[256],{"type":50,"value":257},"Assessment Signal",{"type":44,"tag":131,"props":259,"children":260},{},[261],{"type":50,"value":262},"Satellite Skill",{"type":44,"tag":131,"props":264,"children":265},{},[266],{"type":50,"value":267},"Load Before",{"type":44,"tag":147,"props":269,"children":270},{},[271,319,352,406,445,484,537,577,630,668,707,746],{"type":44,"tag":127,"props":272,"children":273},{},[274,298,314],{"type":44,"tag":154,"props":275,"children":276},{},[277,283,285,291,292],{"type":44,"tag":207,"props":278,"children":280},{"className":279},[],[281],{"type":50,"value":282},"UsesHttpModules",{"type":50,"value":284},", ",{"type":44,"tag":207,"props":286,"children":288},{"className":287},[],[289],{"type":50,"value":290},"UsesHttpHandlers",{"type":50,"value":284},{"type":44,"tag":207,"props":293,"children":295},{"className":294},[],[296],{"type":50,"value":297},"UsesGlobalAsax",{"type":44,"tag":154,"props":299,"children":300},{},[301,307,308],{"type":44,"tag":207,"props":302,"children":304},{"className":303},[],[305],{"type":50,"value":306},"migrating-global-asax",{"type":50,"value":284},{"type":44,"tag":207,"props":309,"children":311},{"className":310},[],[312],{"type":50,"value":313},"migrating-mvc-http-pipeline",{"type":44,"tag":154,"props":315,"children":316},{},[317],{"type":50,"value":318},"Middleware migration",{"type":44,"tag":127,"props":320,"children":321},{},[322,338,347],{"type":44,"tag":154,"props":323,"children":324},{},[325,331,332],{"type":44,"tag":207,"props":326,"children":328},{"className":327},[],[329],{"type":50,"value":330},"UsesHttpContextCurrent",{"type":50,"value":284},{"type":44,"tag":207,"props":333,"children":335},{"className":334},[],[336],{"type":50,"value":337},"UsesHttpServerUtility",{"type":44,"tag":154,"props":339,"children":340},{},[341],{"type":44,"tag":207,"props":342,"children":344},{"className":343},[],[345],{"type":50,"value":346},"migrating-mvc-httpcontext",{"type":44,"tag":154,"props":348,"children":349},{},[350],{"type":50,"value":351},"DI container setup",{"type":44,"tag":127,"props":353,"children":354},{},[355,392,401],{"type":44,"tag":154,"props":356,"children":357},{},[358,364,365,371,372,378,379,385,386],{"type":44,"tag":207,"props":359,"children":361},{"className":360},[],[362],{"type":50,"value":363},"UsesFormsAuth",{"type":50,"value":284},{"type":44,"tag":207,"props":366,"children":368},{"className":367},[],[369],{"type":50,"value":370},"UsesMembership",{"type":50,"value":284},{"type":44,"tag":207,"props":373,"children":375},{"className":374},[],[376],{"type":50,"value":377},"UsesWindowsAuth",{"type":50,"value":284},{"type":44,"tag":207,"props":380,"children":382},{"className":381},[],[383],{"type":50,"value":384},"UsesOwinAuth",{"type":50,"value":284},{"type":44,"tag":207,"props":387,"children":389},{"className":388},[],[390],{"type":50,"value":391},"UsesOAuthMiddleware",{"type":44,"tag":154,"props":393,"children":394},{},[395],{"type":44,"tag":207,"props":396,"children":398},{"className":397},[],[399],{"type":50,"value":400},"migrating-mvc-authentication",{"type":44,"tag":154,"props":402,"children":403},{},[404],{"type":50,"value":405},"Authentication migration",{"type":44,"tag":127,"props":407,"children":408},{},[409,432,441],{"type":44,"tag":154,"props":410,"children":411},{},[412,418,419,425,426],{"type":44,"tag":207,"props":413,"children":415},{"className":414},[],[416],{"type":50,"value":417},"UsesOwin",{"type":50,"value":284},{"type":44,"tag":207,"props":420,"children":422},{"className":421},[],[423],{"type":50,"value":424},"UsesKatana",{"type":50,"value":284},{"type":44,"tag":207,"props":427,"children":429},{"className":428},[],[430],{"type":50,"value":431},"UsesAppBuilder",{"type":44,"tag":154,"props":433,"children":434},{},[435],{"type":44,"tag":207,"props":436,"children":438},{"className":437},[],[439],{"type":50,"value":440},"migrating-owin-to-aspnet-core",{"type":44,"tag":154,"props":442,"children":443},{},[444],{"type":50,"value":318},{"type":44,"tag":127,"props":446,"children":447},{},[448,471,480],{"type":44,"tag":154,"props":449,"children":450},{},[451,457,458,464,465],{"type":44,"tag":207,"props":452,"children":454},{"className":453},[],[455],{"type":50,"value":456},"UsesSession",{"type":50,"value":284},{"type":44,"tag":207,"props":459,"children":461},{"className":460},[],[462],{"type":50,"value":463},"UsesTempData",{"type":50,"value":284},{"type":44,"tag":207,"props":466,"children":468},{"className":467},[],[469],{"type":50,"value":470},"UsesApplicationState",{"type":44,"tag":154,"props":472,"children":473},{},[474],{"type":44,"tag":207,"props":475,"children":477},{"className":476},[],[478],{"type":50,"value":479},"migrating-mvc-session-state",{"type":44,"tag":154,"props":481,"children":482},{},[483],{"type":50,"value":351},{"type":44,"tag":127,"props":485,"children":486},{},[487,524,533],{"type":44,"tag":154,"props":488,"children":489},{},[490,496,497,503,504,510,511,517,518],{"type":44,"tag":207,"props":491,"children":493},{"className":492},[],[494],{"type":50,"value":495},"UsesCustomDependencyResolver",{"type":50,"value":284},{"type":44,"tag":207,"props":498,"children":500},{"className":499},[],[501],{"type":50,"value":502},"UsesAutofac",{"type":50,"value":284},{"type":44,"tag":207,"props":505,"children":507},{"className":506},[],[508],{"type":50,"value":509},"UsesUnity",{"type":50,"value":284},{"type":44,"tag":207,"props":512,"children":514},{"className":513},[],[515],{"type":50,"value":516},"UsesNinject",{"type":50,"value":284},{"type":44,"tag":207,"props":519,"children":521},{"className":520},[],[522],{"type":50,"value":523},"UsesCastleWindsor",{"type":44,"tag":154,"props":525,"children":526},{},[527],{"type":44,"tag":207,"props":528,"children":530},{"className":529},[],[531],{"type":50,"value":532},"migrating-mvc-dependency-injection",{"type":44,"tag":154,"props":534,"children":535},{},[536],{"type":50,"value":351},{"type":44,"tag":127,"props":538,"children":539},{},[540,563,572],{"type":44,"tag":154,"props":541,"children":542},{},[543,549,550,556,557],{"type":44,"tag":207,"props":544,"children":546},{"className":545},[],[547],{"type":50,"value":548},"UsesAttributeRouting",{"type":50,"value":284},{"type":44,"tag":207,"props":551,"children":553},{"className":552},[],[554],{"type":50,"value":555},"UsesRouteConstraints",{"type":50,"value":284},{"type":44,"tag":207,"props":558,"children":560},{"className":559},[],[561],{"type":50,"value":562},"UsesAreaRouting",{"type":44,"tag":154,"props":564,"children":565},{},[566],{"type":44,"tag":207,"props":567,"children":569},{"className":568},[],[570],{"type":50,"value":571},"migrating-mvc-routing",{"type":44,"tag":154,"props":573,"children":574},{},[575],{"type":50,"value":576},"Controller migration",{"type":44,"tag":127,"props":578,"children":579},{},[580,610,626],{"type":44,"tag":154,"props":581,"children":582},{},[583,589,590,596,597,603,604],{"type":44,"tag":207,"props":584,"children":586},{"className":585},[],[587],{"type":50,"value":588},"UsesWebApiControllers",{"type":50,"value":284},{"type":44,"tag":207,"props":591,"children":593},{"className":592},[],[594],{"type":50,"value":595},"UsesHttpResponseMessage",{"type":50,"value":284},{"type":44,"tag":207,"props":598,"children":600},{"className":599},[],[601],{"type":50,"value":602},"UsesContentNegotiation",{"type":50,"value":284},{"type":44,"tag":207,"props":605,"children":607},{"className":606},[],[608],{"type":50,"value":609},"UsesCustomFormatters",{"type":44,"tag":154,"props":611,"children":612},{},[613,619,620],{"type":44,"tag":207,"props":614,"children":616},{"className":615},[],[617],{"type":50,"value":618},"migrating-mvc-controllers",{"type":50,"value":284},{"type":44,"tag":207,"props":621,"children":623},{"className":622},[],[624],{"type":50,"value":625},"migrating-mvc-content-negotiation",{"type":44,"tag":154,"props":627,"children":628},{},[629],{"type":50,"value":576},{"type":44,"tag":127,"props":631,"children":632},{},[633,656,664],{"type":44,"tag":154,"props":634,"children":635},{},[636,642,643,649,650],{"type":44,"tag":207,"props":637,"children":639},{"className":638},[],[640],{"type":50,"value":641},"UsesMvcControllers",{"type":50,"value":284},{"type":44,"tag":207,"props":644,"children":646},{"className":645},[],[647],{"type":50,"value":648},"UsesChildActions",{"type":50,"value":284},{"type":44,"tag":207,"props":651,"children":653},{"className":652},[],[654],{"type":50,"value":655},"UsesHtmlHelpers",{"type":44,"tag":154,"props":657,"children":658},{},[659],{"type":44,"tag":207,"props":660,"children":662},{"className":661},[],[663],{"type":50,"value":618},{"type":44,"tag":154,"props":665,"children":666},{},[667],{"type":50,"value":576},{"type":44,"tag":127,"props":669,"children":670},{},[671,694,703],{"type":44,"tag":154,"props":672,"children":673},{},[674,680,681,687,688],{"type":44,"tag":207,"props":675,"children":677},{"className":676},[],[678],{"type":50,"value":679},"UsesCustomFilters",{"type":50,"value":284},{"type":44,"tag":207,"props":682,"children":684},{"className":683},[],[685],{"type":50,"value":686},"UsesOutputCache",{"type":50,"value":284},{"type":44,"tag":207,"props":689,"children":691},{"className":690},[],[692],{"type":50,"value":693},"UsesHandleError",{"type":44,"tag":154,"props":695,"children":696},{},[697],{"type":44,"tag":207,"props":698,"children":700},{"className":699},[],[701],{"type":50,"value":702},"migrating-mvc-filters",{"type":44,"tag":154,"props":704,"children":705},{},[706],{"type":50,"value":576},{"type":44,"tag":127,"props":708,"children":709},{},[710,733,742],{"type":44,"tag":154,"props":711,"children":712},{},[713,719,720,726,727],{"type":44,"tag":207,"props":714,"children":716},{"className":715},[],[717],{"type":50,"value":718},"UsesCustomModelBinders",{"type":50,"value":284},{"type":44,"tag":207,"props":721,"children":723},{"className":722},[],[724],{"type":50,"value":725},"UsesFromUri",{"type":50,"value":284},{"type":44,"tag":207,"props":728,"children":730},{"className":729},[],[731],{"type":50,"value":732},"UsesValueProviders",{"type":44,"tag":154,"props":734,"children":735},{},[736],{"type":44,"tag":207,"props":737,"children":739},{"className":738},[],[740],{"type":50,"value":741},"migrating-mvc-model-binding",{"type":44,"tag":154,"props":743,"children":744},{},[745],{"type":50,"value":576},{"type":44,"tag":127,"props":747,"children":748},{},[749,777,786],{"type":44,"tag":154,"props":750,"children":751},{},[752,758,759,765,766,771,772],{"type":44,"tag":207,"props":753,"children":755},{"className":754},[],[756],{"type":50,"value":757},"UsesMvcViews",{"type":50,"value":284},{"type":44,"tag":207,"props":760,"children":762},{"className":761},[],[763],{"type":50,"value":764},"UsesBundling",{"type":50,"value":284},{"type":44,"tag":207,"props":767,"children":769},{"className":768},[],[770],{"type":50,"value":655},{"type":50,"value":284},{"type":44,"tag":207,"props":773,"children":775},{"className":774},[],[776],{"type":50,"value":648},{"type":44,"tag":154,"props":778,"children":779},{},[780],{"type":44,"tag":207,"props":781,"children":783},{"className":782},[],[784],{"type":50,"value":785},"migrating-mvc-razor-views",{"type":44,"tag":154,"props":787,"children":788},{},[789],{"type":50,"value":790},"Views migration",{"type":44,"tag":238,"props":792,"children":794},{"id":793},"loading-rules",[795],{"type":50,"value":796},"Loading Rules",{"type":44,"tag":798,"props":799,"children":800},"ol",{},[801,811,821,831],{"type":44,"tag":78,"props":802,"children":803},{},[804,809],{"type":44,"tag":66,"props":805,"children":806},{},[807],{"type":50,"value":808},"During baseline capture",{"type":50,"value":810}," — inventory which satellites will be needed\nfor this project and note them. Do not load them yet.",{"type":44,"tag":78,"props":812,"children":813},{},[814,819],{"type":44,"tag":66,"props":815,"children":816},{},[817],{"type":50,"value":818},"Load satellite just before the step that needs it",{"type":50,"value":820}," — not all upfront. Token\nbudget matters; load only what the current step requires.",{"type":44,"tag":78,"props":822,"children":823},{},[824,829],{"type":44,"tag":66,"props":825,"children":826},{},[827],{"type":50,"value":828},"If a satellite is not available",{"type":50,"value":830}," — proceed with caution, note the gap, apply\ngeneral knowledge, and flag areas requiring manual review.",{"type":44,"tag":78,"props":832,"children":833},{},[834,839],{"type":44,"tag":66,"props":835,"children":836},{},[837],{"type":50,"value":838},"Multiple satellites may apply to the same step",{"type":50,"value":840}," — load all relevant ones before\nstarting that step.",{"type":44,"tag":216,"props":842,"children":843},{},[],{"type":44,"tag":53,"props":845,"children":847},{"id":846},"migration-steps",[848],{"type":50,"value":849},"Migration Steps",{"type":44,"tag":60,"props":851,"children":852},{},[853,855,859],{"type":50,"value":854},"These steps apply to both modes. In-place executes them sequentially.\nSide-by-side splits them across tasks — see ",{"type":44,"tag":194,"props":856,"children":857},{"href":196},[858],{"type":50,"value":196},{"type":50,"value":860},".",{"type":44,"tag":216,"props":862,"children":863},{},[],{"type":44,"tag":238,"props":865,"children":867},{"id":866},"baseline-capture",[868],{"type":50,"value":869},"Baseline Capture",{"type":44,"tag":60,"props":871,"children":872},{},[873],{"type":50,"value":874},"Before any changes, record:",{"type":44,"tag":60,"props":876,"children":877},{},[878,883],{"type":44,"tag":66,"props":879,"children":880},{},[881],{"type":50,"value":882},"Endpoint inventory",{"type":50,"value":884}," (becomes acceptance checklist for final verification):",{"type":44,"tag":74,"props":886,"children":887},{},[888,893,898,903],{"type":44,"tag":78,"props":889,"children":890},{},[891],{"type":50,"value":892},"All routes and HTTP methods",{"type":44,"tag":78,"props":894,"children":895},{},[896],{"type":50,"value":897},"Expected response shapes and status codes per endpoint",{"type":44,"tag":78,"props":899,"children":900},{},[901],{"type":50,"value":902},"Authentication\u002Fauthorization rules per endpoint",{"type":44,"tag":78,"props":904,"children":905},{},[906],{"type":50,"value":907},"Custom HTTP headers set by the application",{"type":44,"tag":60,"props":909,"children":910},{},[911,916],{"type":44,"tag":66,"props":912,"children":913},{},[914],{"type":50,"value":915},"Pipeline inventory",{"type":50,"value":917}," (drives middleware migration):",{"type":44,"tag":74,"props":919,"children":920},{},[921,934,954],{"type":44,"tag":78,"props":922,"children":923},{},[924,926,932],{"type":50,"value":925},"All ",{"type":44,"tag":207,"props":927,"children":929},{"className":928},[],[930],{"type":50,"value":931},"HttpModule",{"type":50,"value":933}," registrations and their pipeline event hooks, in order",{"type":44,"tag":78,"props":935,"children":936},{},[937,938,944,946,952],{"type":50,"value":925},{"type":44,"tag":207,"props":939,"children":941},{"className":940},[],[942],{"type":50,"value":943},"HttpHandler",{"type":50,"value":945}," and ",{"type":44,"tag":207,"props":947,"children":949},{"className":948},[],[950],{"type":50,"value":951},"IHttpAsyncHandler",{"type":50,"value":953}," registrations",{"type":44,"tag":78,"props":955,"children":956},{},[957,958,964],{"type":50,"value":925},{"type":44,"tag":207,"props":959,"children":961},{"className":960},[],[962],{"type":50,"value":963},"Global.asax",{"type":50,"value":965}," event handlers in use",{"type":44,"tag":60,"props":967,"children":968},{},[969,974],{"type":44,"tag":66,"props":970,"children":971},{},[972],{"type":50,"value":973},"Feature inventory",{"type":50,"value":975}," (determines satellite loading):",{"type":44,"tag":74,"props":977,"children":978},{},[979,984,1005,1010,1015],{"type":44,"tag":78,"props":980,"children":981},{},[982],{"type":50,"value":983},"Review assessment signals and note which satellites from the loading guide above apply",{"type":44,"tag":78,"props":985,"children":986},{},[987,989,995,997,1003],{"type":50,"value":988},"Flag any ",{"type":44,"tag":207,"props":990,"children":992},{"className":991},[],[993],{"type":50,"value":994},"HttpContext.Current",{"type":50,"value":996}," \u002F ",{"type":44,"tag":207,"props":998,"children":1000},{"className":999},[],[1001],{"type":50,"value":1002},"ClaimsPrincipal.Current",{"type":50,"value":1004}," static access patterns",{"type":44,"tag":78,"props":1006,"children":1007},{},[1008],{"type":50,"value":1009},"Flag any third-party DI container in use",{"type":44,"tag":78,"props":1011,"children":1012},{},[1013],{"type":50,"value":1014},"Flag session, TempData, or application state usage",{"type":44,"tag":78,"props":1016,"children":1017},{},[1018],{"type":50,"value":1019},"Flag any OWIN\u002FKatana middleware",{"type":44,"tag":60,"props":1021,"children":1022},{},[1023,1028],{"type":44,"tag":66,"props":1024,"children":1025},{},[1026],{"type":50,"value":1027},"Gate",{"type":50,"value":1029},": Baseline document exists. Satellite list noted. No proceeding until complete —\nthis document is the acceptance oracle for final verification.",{"type":44,"tag":216,"props":1031,"children":1032},{},[],{"type":44,"tag":238,"props":1034,"children":1036},{"id":1035},"project-file-and-sdk",[1037],{"type":50,"value":1038},"Project File and SDK",{"type":44,"tag":74,"props":1040,"children":1041},{},[1042,1055,1068,1087,1100,1112],{"type":44,"tag":78,"props":1043,"children":1044},{},[1045,1047,1053],{"type":50,"value":1046},"Replace legacy ",{"type":44,"tag":207,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":50,"value":1052},".csproj",{"type":50,"value":1054}," format with SDK-style format",{"type":44,"tag":78,"props":1056,"children":1057},{},[1058,1060,1066],{"type":50,"value":1059},"Set ",{"type":44,"tag":207,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":50,"value":1065},"\u003CTargetFramework>",{"type":50,"value":1067}," to target version",{"type":44,"tag":78,"props":1069,"children":1070},{},[1071,1073,1079,1081],{"type":50,"value":1072},"Remove ",{"type":44,"tag":207,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":50,"value":1078},"packages.config",{"type":50,"value":1080}," — migrate all references to ",{"type":44,"tag":207,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":50,"value":1086},"\u003CPackageReference>",{"type":44,"tag":78,"props":1088,"children":1089},{},[1090,1092,1098],{"type":50,"value":1091},"Remove web-specific MSBuild imports (",{"type":44,"tag":207,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":50,"value":1097},"Microsoft.WebApplication.targets",{"type":50,"value":1099},", etc.)",{"type":44,"tag":78,"props":1101,"children":1102},{},[1103,1104,1110],{"type":50,"value":1072},{"type":44,"tag":207,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":50,"value":1109},"System.Web",{"type":50,"value":1111}," assembly references from project file",{"type":44,"tag":78,"props":1113,"children":1114},{},[1115],{"type":50,"value":1116},"Verify no orphaned references remain",{"type":44,"tag":60,"props":1118,"children":1119},{},[1120,1124],{"type":44,"tag":66,"props":1121,"children":1122},{},[1123],{"type":50,"value":1027},{"type":50,"value":1125},": Project loads in IDE without errors. No compilation required yet.",{"type":44,"tag":216,"props":1127,"children":1128},{},[],{"type":44,"tag":238,"props":1130,"children":1132},{"id":1131},"entry-point-and-host",[1133],{"type":50,"value":1134},"Entry Point and Host",{"type":44,"tag":74,"props":1136,"children":1137},{},[1138,1159,1172],{"type":44,"tag":78,"props":1139,"children":1140},{},[1141,1143,1149,1151,1157],{"type":50,"value":1142},"Create ",{"type":44,"tag":207,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":50,"value":1148},"Program.cs",{"type":50,"value":1150}," with minimal ",{"type":44,"tag":207,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":50,"value":1156},"WebApplication",{"type":50,"value":1158}," host — no features, stub only",{"type":44,"tag":78,"props":1160,"children":1161},{},[1162,1164,1170],{"type":50,"value":1163},"Wire ",{"type":44,"tag":207,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":50,"value":1169},"app.MapGet(\"\u002Fhealth\", () => \"ok\")",{"type":50,"value":1171}," as a smoke test endpoint",{"type":44,"tag":78,"props":1173,"children":1174},{},[1175,1177,1183,1185,1191],{"type":50,"value":1176},"Verify: ",{"type":44,"tag":207,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":50,"value":1182},"dotnet build",{"type":50,"value":1184}," succeeds, ",{"type":44,"tag":207,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":50,"value":1190},"dotnet run",{"type":50,"value":1192}," starts, stub endpoint returns 200",{"type":44,"tag":60,"props":1194,"children":1195},{},[1196,1200],{"type":44,"tag":66,"props":1197,"children":1198},{},[1199],{"type":50,"value":1027},{"type":50,"value":1201},": App starts and responds. This is the \"green field confirmed\" gate.\nDo not add any features until this is green — a broken host wastes all subsequent work.",{"type":44,"tag":216,"props":1203,"children":1204},{},[],{"type":44,"tag":238,"props":1206,"children":1208},{"id":1207},"configuration",[1209],{"type":50,"value":1210},"Configuration",{"type":44,"tag":74,"props":1212,"children":1213},{},[1214,1241,1265,1282,1301,1319,1338],{"type":44,"tag":78,"props":1215,"children":1216},{},[1217,1219,1225,1227,1233,1235],{"type":50,"value":1218},"Migrate ",{"type":44,"tag":207,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":50,"value":1224},"Web.config",{"type":50,"value":1226}," ",{"type":44,"tag":207,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":50,"value":1232},"\u003CappSettings>",{"type":50,"value":1234}," → ",{"type":44,"tag":207,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":50,"value":1240},"appsettings.json",{"type":44,"tag":78,"props":1242,"children":1243},{},[1244,1245,1250,1251,1257,1258,1263],{"type":50,"value":1218},{"type":44,"tag":207,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":50,"value":1224},{"type":50,"value":1226},{"type":44,"tag":207,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":50,"value":1256},"\u003CconnectionStrings>",{"type":50,"value":1234},{"type":44,"tag":207,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":50,"value":1240},{"type":50,"value":1264}," connection strings section",{"type":44,"tag":78,"props":1266,"children":1267},{},[1268,1269,1275,1277],{"type":50,"value":1163},{"type":44,"tag":207,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":50,"value":1274},"IConfiguration",{"type":50,"value":1276}," in ",{"type":44,"tag":207,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":50,"value":1148},{"type":44,"tag":78,"props":1283,"children":1284},{},[1285,1287,1293,1295],{"type":50,"value":1286},"Replace all ",{"type":44,"tag":207,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":50,"value":1292},"ConfigurationManager.AppSettings[\"key\"]",{"type":50,"value":1294}," calls with ",{"type":44,"tag":207,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":50,"value":1300},"IConfiguration[\"key\"]",{"type":44,"tag":78,"props":1302,"children":1303},{},[1304,1305,1311,1313],{"type":50,"value":1286},{"type":44,"tag":207,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":50,"value":1310},"ConfigurationManager.ConnectionStrings[\"name\"]",{"type":50,"value":1312}," with ",{"type":44,"tag":207,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":50,"value":1318},"IConfiguration.GetConnectionString(\"name\")",{"type":44,"tag":78,"props":1320,"children":1321},{},[1322,1324,1330,1332],{"type":50,"value":1323},"Migrate environment-specific transforms (",{"type":44,"tag":207,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":50,"value":1329},"Web.Debug.config",{"type":50,"value":1331},") → ",{"type":44,"tag":207,"props":1333,"children":1335},{"className":1334},[],[1336],{"type":50,"value":1337},"appsettings.Development.json",{"type":44,"tag":78,"props":1339,"children":1340},{},[1341],{"type":50,"value":1342},"Move secrets (passwords, API keys) out of config files → User Secrets (dev) or environment variables",{"type":44,"tag":60,"props":1344,"children":1345},{},[1346,1350,1352,1357,1359,1365],{"type":44,"tag":66,"props":1347,"children":1348},{},[1349],{"type":50,"value":1027},{"type":50,"value":1351},": All configuration keys accessible via ",{"type":44,"tag":207,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":50,"value":1274},{"type":50,"value":1358},".\nNo ",{"type":44,"tag":207,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":50,"value":1364},"ConfigurationManager",{"type":50,"value":1366}," references remain in non-legacy code.",{"type":44,"tag":60,"props":1368,"children":1369},{},[1370,1375],{"type":44,"tag":66,"props":1371,"children":1372},{},[1373],{"type":50,"value":1374},"Note",{"type":50,"value":1376},": Do not migrate authentication configuration here — that belongs to the\nauthentication migration step.\nConnection strings are config, auth settings are not.",{"type":44,"tag":1378,"props":1379,"children":1380},"blockquote",{},[1381],{"type":44,"tag":60,"props":1382,"children":1383},{},[1384,1389,1391,1397,1398,1404,1406,1412,1414],{"type":44,"tag":66,"props":1385,"children":1386},{},[1387],{"type":50,"value":1388},"If",{"type":50,"value":1390}," assessment signals include ",{"type":44,"tag":207,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":50,"value":1396},"UsesCustomConfigSections",{"type":50,"value":284},{"type":44,"tag":207,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":50,"value":1403},"UsesEncryptedConfig",{"type":50,"value":1405},",\nor ",{"type":44,"tag":207,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":50,"value":1411},"UsesConfigTransforms",{"type":50,"value":1413}," beyond simple appSettings → flag for manual review.\nCustom config section types have no direct equivalent and require IOptions",{"type":44,"tag":1415,"props":1416,"children":1417},"t",{},[1418],{"type":50,"value":1419}," redesign.",{"type":44,"tag":216,"props":1421,"children":1422},{},[],{"type":44,"tag":238,"props":1424,"children":1426},{"id":1425},"dependency-injection-container",[1427],{"type":50,"value":1428},"Dependency Injection Container",{"type":44,"tag":1378,"props":1430,"children":1431},{},[1432,1442],{"type":44,"tag":60,"props":1433,"children":1434},{},[1435,1440],{"type":44,"tag":66,"props":1436,"children":1437},{},[1438],{"type":50,"value":1439},"Load satellites before this phase",{"type":50,"value":1441},":",{"type":44,"tag":74,"props":1443,"children":1444},{},[1445,1485,1506],{"type":44,"tag":78,"props":1446,"children":1447},{},[1448,1453,1455,1460,1461,1466,1467,1472,1474,1479,1480],{"type":44,"tag":207,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":50,"value":532},{"type":50,"value":1454}," if any of: ",{"type":44,"tag":207,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":50,"value":502},{"type":50,"value":284},{"type":44,"tag":207,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":50,"value":509},{"type":50,"value":284},{"type":44,"tag":207,"props":1468,"children":1470},{"className":1469},[],[1471],{"type":50,"value":516},{"type":50,"value":1473},",\n",{"type":44,"tag":207,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":50,"value":523},{"type":50,"value":284},{"type":44,"tag":207,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":50,"value":495},{"type":44,"tag":78,"props":1486,"children":1487},{},[1488,1493,1495,1500,1501],{"type":44,"tag":207,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":50,"value":346},{"type":50,"value":1494}," if: ",{"type":44,"tag":207,"props":1496,"children":1498},{"className":1497},[],[1499],{"type":50,"value":330},{"type":50,"value":284},{"type":44,"tag":207,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":50,"value":337},{"type":44,"tag":78,"props":1507,"children":1508},{},[1509,1514,1515,1520,1521],{"type":44,"tag":207,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":50,"value":479},{"type":50,"value":1494},{"type":44,"tag":207,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":50,"value":456},{"type":50,"value":284},{"type":44,"tag":207,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":50,"value":470},{"type":44,"tag":74,"props":1527,"children":1528},{},[1529,1541,1569,1582,1602,1615],{"type":44,"tag":78,"props":1530,"children":1531},{},[1532,1534,1539],{"type":50,"value":1533},"Register all application services in ",{"type":44,"tag":207,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":50,"value":1148},{"type":50,"value":1540}," or extension methods",{"type":44,"tag":78,"props":1542,"children":1543},{},[1544,1546,1552,1554,1560,1562,1568],{"type":50,"value":1545},"Replace ",{"type":44,"tag":207,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":50,"value":1551},"DependencyResolver.SetResolver",{"type":50,"value":1553}," (MVC) or ",{"type":44,"tag":207,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":50,"value":1559},"config.DependencyResolver",{"type":50,"value":1561}," (WebAPI)\nwith ",{"type":44,"tag":207,"props":1563,"children":1565},{"className":1564},[],[1566],{"type":50,"value":1567},"builder.Services",{"type":50,"value":953},{"type":44,"tag":78,"props":1570,"children":1571},{},[1572,1574,1580],{"type":50,"value":1573},"Register ",{"type":44,"tag":207,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":50,"value":1579},"DbContext",{"type":50,"value":1581},", repositories, application services",{"type":44,"tag":78,"props":1583,"children":1584},{},[1585,1587,1593,1595,1600],{"type":50,"value":1586},"Add ",{"type":44,"tag":207,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":50,"value":1592},"IHttpContextAccessor",{"type":50,"value":1594}," registration if ",{"type":44,"tag":207,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":50,"value":994},{"type":50,"value":1601}," usage was found during baseline capture",{"type":44,"tag":78,"props":1603,"children":1604},{},[1605,1607,1613],{"type":50,"value":1606},"Register session services if session usage was found (",{"type":44,"tag":207,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":50,"value":1612},"builder.Services.AddSession()",{"type":50,"value":1614},")",{"type":44,"tag":78,"props":1616,"children":1617},{},[1618,1620,1625,1627,1633],{"type":50,"value":1619},"Do not implement services that still have ",{"type":44,"tag":207,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":50,"value":1109},{"type":50,"value":1626}," dependencies — stub them with\n",{"type":44,"tag":207,"props":1628,"children":1630},{"className":1629},[],[1631],{"type":50,"value":1632},"NotImplementedException",{"type":50,"value":1634}," and a TODO comment, resolve during controller migration",{"type":44,"tag":60,"props":1636,"children":1637},{},[1638,1643],{"type":44,"tag":66,"props":1639,"children":1640},{},[1641],{"type":50,"value":1642},"Lifetime mapping",{"type":50,"value":1441},{"type":44,"tag":119,"props":1645,"children":1646},{},[1647,1663],{"type":44,"tag":123,"props":1648,"children":1649},{},[1650],{"type":44,"tag":127,"props":1651,"children":1652},{},[1653,1658],{"type":44,"tag":131,"props":1654,"children":1655},{},[1656],{"type":50,"value":1657},"Old",{"type":44,"tag":131,"props":1659,"children":1660},{},[1661],{"type":50,"value":1662},"New",{"type":44,"tag":147,"props":1664,"children":1665},{},[1666,1689,1705],{"type":44,"tag":127,"props":1667,"children":1668},{},[1669,1680],{"type":44,"tag":154,"props":1670,"children":1671},{},[1672,1674],{"type":50,"value":1673},"Per-request \u002F ",{"type":44,"tag":207,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":50,"value":1679},"InstancePerRequest",{"type":44,"tag":154,"props":1681,"children":1682},{},[1683],{"type":44,"tag":207,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":50,"value":1688},"Scoped",{"type":44,"tag":127,"props":1690,"children":1691},{},[1692,1697],{"type":44,"tag":154,"props":1693,"children":1694},{},[1695],{"type":50,"value":1696},"Singleton",{"type":44,"tag":154,"props":1698,"children":1699},{},[1700],{"type":44,"tag":207,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":50,"value":1696},{"type":44,"tag":127,"props":1706,"children":1707},{},[1708,1719],{"type":44,"tag":154,"props":1709,"children":1710},{},[1711,1713],{"type":50,"value":1712},"Transient \u002F ",{"type":44,"tag":207,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":50,"value":1718},"InstancePerDependency",{"type":44,"tag":154,"props":1720,"children":1721},{},[1722],{"type":44,"tag":207,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":50,"value":1727},"Transient",{"type":44,"tag":60,"props":1729,"children":1730},{},[1731,1735],{"type":44,"tag":66,"props":1732,"children":1733},{},[1734],{"type":50,"value":1027},{"type":50,"value":1736},": Application starts and DI container resolves without errors.\nAll services registered (stubs acceptable for System.Web-dependent ones).",{"type":44,"tag":216,"props":1738,"children":1739},{},[],{"type":44,"tag":238,"props":1741,"children":1743},{"id":1742},"controllers-and-action-results",[1744],{"type":50,"value":1745},"Controllers and Action Results",{"type":44,"tag":1378,"props":1747,"children":1748},{},[1749,1757],{"type":44,"tag":60,"props":1750,"children":1751},{},[1752,1756],{"type":44,"tag":66,"props":1753,"children":1754},{},[1755],{"type":50,"value":1439},{"type":50,"value":1441},{"type":44,"tag":74,"props":1758,"children":1759},{},[1760,1786,1806,1826,1852],{"type":44,"tag":78,"props":1761,"children":1762},{},[1763,1768,1769,1774,1775,1780,1781],{"type":44,"tag":207,"props":1764,"children":1766},{"className":1765},[],[1767],{"type":50,"value":571},{"type":50,"value":1494},{"type":44,"tag":207,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":50,"value":548},{"type":50,"value":284},{"type":44,"tag":207,"props":1776,"children":1778},{"className":1777},[],[1779],{"type":50,"value":555},{"type":50,"value":284},{"type":44,"tag":207,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":50,"value":562},{"type":44,"tag":78,"props":1787,"children":1788},{},[1789,1794,1795,1800,1801],{"type":44,"tag":207,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":50,"value":618},{"type":50,"value":1494},{"type":44,"tag":207,"props":1796,"children":1798},{"className":1797},[],[1799],{"type":50,"value":588},{"type":50,"value":284},{"type":44,"tag":207,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":50,"value":595},{"type":44,"tag":78,"props":1807,"children":1808},{},[1809,1814,1815,1820,1821],{"type":44,"tag":207,"props":1810,"children":1812},{"className":1811},[],[1813],{"type":50,"value":618},{"type":50,"value":1494},{"type":44,"tag":207,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":50,"value":641},{"type":50,"value":284},{"type":44,"tag":207,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":50,"value":648},{"type":44,"tag":78,"props":1827,"children":1828},{},[1829,1834,1835,1840,1841,1846,1847],{"type":44,"tag":207,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":50,"value":702},{"type":50,"value":1494},{"type":44,"tag":207,"props":1836,"children":1838},{"className":1837},[],[1839],{"type":50,"value":679},{"type":50,"value":284},{"type":44,"tag":207,"props":1842,"children":1844},{"className":1843},[],[1845],{"type":50,"value":686},{"type":50,"value":284},{"type":44,"tag":207,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":50,"value":693},{"type":44,"tag":78,"props":1853,"children":1854},{},[1855,1860,1861,1866,1867],{"type":44,"tag":207,"props":1856,"children":1858},{"className":1857},[],[1859],{"type":50,"value":741},{"type":50,"value":1494},{"type":44,"tag":207,"props":1862,"children":1864},{"className":1863},[],[1865],{"type":50,"value":718},{"type":50,"value":284},{"type":44,"tag":207,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":50,"value":725},{"type":44,"tag":1378,"props":1873,"children":1874},{},[1875,1885,1895,1920,1978,1983,2026],{"type":44,"tag":60,"props":1876,"children":1877},{},[1878,1883],{"type":44,"tag":66,"props":1879,"children":1880},{},[1881],{"type":50,"value":1882},"In Side-by-Side mode",{"type":50,"value":1884},": This phase is the repeating migration unit.\nEach unit = one controller group (by feature area) + associated filters + models.\nComplete and validate each unit before starting the next.\nSee Mode Reference section for unit ordering guidance.",{"type":44,"tag":60,"props":1886,"children":1887},{},[1888,1893],{"type":44,"tag":66,"props":1889,"children":1890},{},[1891],{"type":50,"value":1892},"Controller triage",{"type":50,"value":1894}," (before creating units): Read each controller file to\nassess complexity — constructor dependencies, auth requirements, action count,\nuse of complex features (child actions, custom filters, model binders), and\nany other signals that indicate migration difficulty. Group by feature area\n(folders, naming, areas). Order: simplest first, auth-dependent last.\nComplex controllers with many dependencies should be their own unit.",{"type":44,"tag":60,"props":1896,"children":1897},{},[1898,1903,1905,1911,1913,1918],{"type":44,"tag":66,"props":1899,"children":1900},{},[1901],{"type":50,"value":1902},"Per-unit dependency discovery",{"type":50,"value":1904}," (when starting each unit): Use\n",{"type":44,"tag":207,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":50,"value":1910},"get_code_dependencies",{"type":50,"value":1912}," on the controller(s) in the current unit to discover\nexplicit code dependencies — services, models, views, packages. Then also\ncheck for ",{"type":44,"tag":66,"props":1914,"children":1915},{},[1916],{"type":50,"value":1917},"implicit dependencies",{"type":50,"value":1919}," not visible in the code graph:",{"type":44,"tag":74,"props":1921,"children":1922},{},[1923,1928,1946,1966],{"type":44,"tag":78,"props":1924,"children":1925},{},[1926],{"type":50,"value":1927},"Review baseline capture: which HTTP modules, handlers, or Global.asax\nevents affect this controller's endpoints?",{"type":44,"tag":78,"props":1929,"children":1930},{},[1931,1933,1938,1939,1944],{"type":50,"value":1932},"Check for ",{"type":44,"tag":207,"props":1934,"children":1936},{"className":1935},[],[1937],{"type":50,"value":994},{"type":50,"value":284},{"type":44,"tag":207,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":50,"value":1364},{"type":50,"value":1945},", or static helper\nusage that won't work in Core without explicit registration",{"type":44,"tag":78,"props":1947,"children":1948},{},[1949,1951,1957,1958,1964],{"type":50,"value":1950},"Check ",{"type":44,"tag":207,"props":1952,"children":1954},{"className":1953},[],[1955],{"type":50,"value":1956},"RouteConfig.cs",{"type":50,"value":996},{"type":44,"tag":207,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":50,"value":1963},"WebApiConfig.cs",{"type":50,"value":1965}," for non-attribute routes that\nserve this controller",{"type":44,"tag":78,"props":1967,"children":1968},{},[1969,1970,1976],{"type":50,"value":1950},{"type":44,"tag":207,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":50,"value":1975},"FilterConfig.cs",{"type":50,"value":1977}," for global filters this controller depends on",{"type":44,"tag":60,"props":1979,"children":1980},{},[1981],{"type":50,"value":1982},"Verify each dependency is ready in the new project:",{"type":44,"tag":74,"props":1984,"children":1985},{},[1986,1991,2003,2008,2021],{"type":44,"tag":78,"props":1987,"children":1988},{},[1989],{"type":50,"value":1990},"DI: are the controller's injected services registered? Replace stubs if needed.",{"type":44,"tag":78,"props":1992,"children":1993},{},[1994,1996,2001],{"type":50,"value":1995},"Config: are the config keys the controller reads present in ",{"type":44,"tag":207,"props":1997,"children":1999},{"className":1998},[],[2000],{"type":50,"value":1240},{"type":50,"value":2002},"?",{"type":44,"tag":78,"props":2004,"children":2005},{},[2006],{"type":50,"value":2007},"References: can the new project reference the class libraries this controller uses?",{"type":44,"tag":78,"props":2009,"children":2010},{},[2011,2013,2019],{"type":50,"value":2012},"Routes: is ",{"type":44,"tag":207,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":50,"value":2018},"app.MapControllers()",{"type":50,"value":2020}," in the pipeline? Are non-attribute routes configured?",{"type":44,"tag":78,"props":2022,"children":2023},{},[2024],{"type":50,"value":2025},"Pipeline: are HTTP modules this controller depends on replicated as middleware?",{"type":44,"tag":60,"props":2027,"children":2028},{},[2029],{"type":50,"value":2030},"Fix any gaps before porting the controller code. Document in task.md.",{"type":44,"tag":60,"props":2032,"children":2033},{},[2034],{"type":44,"tag":66,"props":2035,"children":2036},{},[2037],{"type":50,"value":2038},"For each controller:",{"type":44,"tag":74,"props":2040,"children":2041},{},[2042,2069,2082,2100,2113,2125,2137,2164,2176],{"type":44,"tag":78,"props":2043,"children":2044},{},[2045,2047,2053,2055,2061,2063],{"type":50,"value":2046},"Change namespace from ",{"type":44,"tag":207,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":50,"value":2052},"System.Web.Mvc",{"type":50,"value":2054}," or ",{"type":44,"tag":207,"props":2056,"children":2058},{"className":2057},[],[2059],{"type":50,"value":2060},"System.Web.Http",{"type":50,"value":2062}," to ",{"type":44,"tag":207,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":50,"value":2068},"Microsoft.AspNetCore.Mvc",{"type":44,"tag":78,"props":2070,"children":2071},{},[2072,2074,2080],{"type":50,"value":2073},"MVC: keep ",{"type":44,"tag":207,"props":2075,"children":2077},{"className":2076},[],[2078],{"type":50,"value":2079},"Controller",{"type":50,"value":2081}," base class",{"type":44,"tag":78,"props":2083,"children":2084},{},[2085,2087,2093,2094],{"type":50,"value":2086},"WebAPI: switch from ",{"type":44,"tag":207,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":50,"value":2092},"ApiController",{"type":50,"value":2062},{"type":44,"tag":207,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":50,"value":2099},"ControllerBase",{"type":44,"tag":78,"props":2101,"children":2102},{},[2103,2105,2111],{"type":50,"value":2104},"Apply ",{"type":44,"tag":207,"props":2106,"children":2108},{"className":2107},[],[2109],{"type":50,"value":2110},"[ApiController]",{"type":50,"value":2112}," attribute if pure API (no views) — understand its behavior\nchanges before applying (auto-400, binding inference)",{"type":44,"tag":78,"props":2114,"children":2115},{},[2116,2118,2123],{"type":50,"value":2117},"Migrate route attributes — consult ",{"type":44,"tag":207,"props":2119,"children":2121},{"className":2120},[],[2122],{"type":50,"value":571},{"type":50,"value":2124}," satellite for combining rules",{"type":44,"tag":78,"props":2126,"children":2127},{},[2128,2130,2135],{"type":50,"value":2129},"Migrate return types — consult ",{"type":44,"tag":207,"props":2131,"children":2133},{"className":2132},[],[2134],{"type":50,"value":618},{"type":50,"value":2136}," for WebAPI specifics",{"type":44,"tag":78,"props":2138,"children":2139},{},[2140,2142,2148,2149,2155,2157,2163],{"type":50,"value":2141},"Migrate binding source attributes (",{"type":44,"tag":207,"props":2143,"children":2145},{"className":2144},[],[2146],{"type":50,"value":2147},"[FromUri]",{"type":50,"value":1234},{"type":44,"tag":207,"props":2150,"children":2152},{"className":2151},[],[2153],{"type":50,"value":2154},"[FromQuery]",{"type":50,"value":2156},"\u002F",{"type":44,"tag":207,"props":2158,"children":2160},{"className":2159},[],[2161],{"type":50,"value":2162},"[FromRoute]",{"type":50,"value":1614},{"type":44,"tag":78,"props":2165,"children":2166},{},[2167,2169,2174],{"type":50,"value":2168},"Migrate associated filters — consult ",{"type":44,"tag":207,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":50,"value":702},{"type":50,"value":2175}," satellite",{"type":44,"tag":78,"props":2177,"children":2178},{},[2179,2180,2186],{"type":50,"value":1072},{"type":44,"tag":207,"props":2181,"children":2183},{"className":2182},[],[2184],{"type":50,"value":2185},"AreaRegistration",{"type":50,"value":2187}," classes — keep area folder structure, registration is now automatic",{"type":44,"tag":60,"props":2189,"children":2190},{},[2191,2196],{"type":44,"tag":66,"props":2192,"children":2193},{},[2194],{"type":50,"value":2195},"Gate (per unit in side-by-side)",{"type":50,"value":2197},": Unit builds, all endpoints in unit return expected\nstatus codes per baseline, unit tests pass.",{"type":44,"tag":60,"props":2199,"children":2200},{},[2201,2206],{"type":44,"tag":66,"props":2202,"children":2203},{},[2204],{"type":50,"value":2205},"Gate (in-place)",{"type":50,"value":2207},": All controllers migrated, solution builds, all endpoints respond\nper baseline.",{"type":44,"tag":216,"props":2209,"children":2210},{},[],{"type":44,"tag":238,"props":2212,"children":2214},{"id":2213},"middleware-pipeline",[2215],{"type":50,"value":2216},"Middleware Pipeline",{"type":44,"tag":1378,"props":2218,"children":2219},{},[2220,2228],{"type":44,"tag":60,"props":2221,"children":2222},{},[2223,2227],{"type":44,"tag":66,"props":2224,"children":2225},{},[2226],{"type":50,"value":1439},{"type":50,"value":1441},{"type":44,"tag":74,"props":2229,"children":2230},{},[2231,2263],{"type":44,"tag":78,"props":2232,"children":2233},{},[2234,2239,2240,2245,2246,2251,2252,2257,2258],{"type":44,"tag":207,"props":2235,"children":2237},{"className":2236},[],[2238],{"type":50,"value":306},{"type":50,"value":284},{"type":44,"tag":207,"props":2241,"children":2243},{"className":2242},[],[2244],{"type":50,"value":313},{"type":50,"value":1494},{"type":44,"tag":207,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":50,"value":282},{"type":50,"value":284},{"type":44,"tag":207,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":50,"value":290},{"type":50,"value":284},{"type":44,"tag":207,"props":2259,"children":2261},{"className":2260},[],[2262],{"type":50,"value":297},{"type":44,"tag":78,"props":2264,"children":2265},{},[2266,2271,2272,2277,2278],{"type":44,"tag":207,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":50,"value":440},{"type":50,"value":1494},{"type":44,"tag":207,"props":2273,"children":2275},{"className":2274},[],[2276],{"type":50,"value":417},{"type":50,"value":284},{"type":44,"tag":207,"props":2279,"children":2281},{"className":2280},[],[2282],{"type":50,"value":424},{"type":44,"tag":60,"props":2284,"children":2285},{},[2286,2291],{"type":44,"tag":66,"props":2287,"children":2288},{},[2289],{"type":50,"value":2290},"Pipeline ordering is the critical concern here.",{"type":50,"value":2292}," Reconstruct from baseline inventory.",{"type":44,"tag":60,"props":2294,"children":2295},{},[2296],{"type":50,"value":2297},"High-level mapping reference:",{"type":44,"tag":119,"props":2299,"children":2300},{},[2301,2317],{"type":44,"tag":123,"props":2302,"children":2303},{},[2304],{"type":44,"tag":127,"props":2305,"children":2306},{},[2307,2312],{"type":44,"tag":131,"props":2308,"children":2309},{},[2310],{"type":50,"value":2311},"Old construct",{"type":44,"tag":131,"props":2313,"children":2314},{},[2315],{"type":50,"value":2316},"Core equivalent",{"type":44,"tag":147,"props":2318,"children":2319},{},[2320,2343,2365,2388,2405,2421,2443,2464,2481],{"type":44,"tag":127,"props":2321,"children":2322},{},[2323,2332],{"type":44,"tag":154,"props":2324,"children":2325},{},[2326],{"type":44,"tag":207,"props":2327,"children":2329},{"className":2328},[],[2330],{"type":50,"value":2331},"IHttpModule.BeginRequest",{"type":44,"tag":154,"props":2333,"children":2334},{},[2335,2337],{"type":50,"value":2336},"Middleware registered before ",{"type":44,"tag":207,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":50,"value":2342},"next()",{"type":44,"tag":127,"props":2344,"children":2345},{},[2346,2355],{"type":44,"tag":154,"props":2347,"children":2348},{},[2349],{"type":44,"tag":207,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":50,"value":2354},"IHttpModule.EndRequest",{"type":44,"tag":154,"props":2356,"children":2357},{},[2358,2360],{"type":50,"value":2359},"Middleware registered after ",{"type":44,"tag":207,"props":2361,"children":2363},{"className":2362},[],[2364],{"type":50,"value":2342},{"type":44,"tag":127,"props":2366,"children":2367},{},[2368,2377],{"type":44,"tag":154,"props":2369,"children":2370},{},[2371],{"type":44,"tag":207,"props":2372,"children":2374},{"className":2373},[],[2375],{"type":50,"value":2376},"IHttpModule.AuthenticateRequest",{"type":44,"tag":154,"props":2378,"children":2379},{},[2380,2382],{"type":50,"value":2381},"Auth middleware — position relative to ",{"type":44,"tag":207,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":50,"value":2387},"UseAuthentication()",{"type":44,"tag":127,"props":2389,"children":2390},{},[2391,2400],{"type":44,"tag":154,"props":2392,"children":2393},{},[2394],{"type":44,"tag":207,"props":2395,"children":2397},{"className":2396},[],[2398],{"type":50,"value":2399},"IHttpHandler",{"type":44,"tag":154,"props":2401,"children":2402},{},[2403],{"type":50,"value":2404},"Minimal API endpoint or terminal middleware",{"type":44,"tag":127,"props":2406,"children":2407},{},[2408,2416],{"type":44,"tag":154,"props":2409,"children":2410},{},[2411],{"type":44,"tag":207,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":50,"value":951},{"type":44,"tag":154,"props":2417,"children":2418},{},[2419],{"type":50,"value":2420},"Async terminal middleware",{"type":44,"tag":127,"props":2422,"children":2423},{},[2424,2433],{"type":44,"tag":154,"props":2425,"children":2426},{},[2427],{"type":44,"tag":207,"props":2428,"children":2430},{"className":2429},[],[2431],{"type":50,"value":2432},"Global.asax Application_Start",{"type":44,"tag":154,"props":2434,"children":2435},{},[2436,2441],{"type":44,"tag":207,"props":2437,"children":2439},{"className":2438},[],[2440],{"type":50,"value":1148},{"type":50,"value":2442}," startup code",{"type":44,"tag":127,"props":2444,"children":2445},{},[2446,2455],{"type":44,"tag":154,"props":2447,"children":2448},{},[2449],{"type":44,"tag":207,"props":2450,"children":2452},{"className":2451},[],[2453],{"type":50,"value":2454},"Global.asax Application_End",{"type":44,"tag":154,"props":2456,"children":2457},{},[2458],{"type":44,"tag":207,"props":2459,"children":2461},{"className":2460},[],[2462],{"type":50,"value":2463},"IHostApplicationLifetime.ApplicationStopping",{"type":44,"tag":127,"props":2465,"children":2466},{},[2467,2476],{"type":44,"tag":154,"props":2468,"children":2469},{},[2470],{"type":44,"tag":207,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":50,"value":2475},"Global.asax Application_Error",{"type":44,"tag":154,"props":2477,"children":2478},{},[2479],{"type":50,"value":2480},"Exception handling middleware",{"type":44,"tag":127,"props":2482,"children":2483},{},[2484,2495],{"type":44,"tag":154,"props":2485,"children":2486},{},[2487,2493],{"type":44,"tag":207,"props":2488,"children":2490},{"className":2489},[],[2491],{"type":50,"value":2492},"DelegatingHandler",{"type":50,"value":2494}," (WebAPI)",{"type":44,"tag":154,"props":2496,"children":2497},{},[2498],{"type":50,"value":2499},"Middleware — position in pipeline must match original handler order",{"type":44,"tag":1378,"props":2501,"children":2502},{},[2503],{"type":44,"tag":60,"props":2504,"children":2505},{},[2506,2508,2513],{"type":50,"value":2507},"For anything beyond basic module-to-middleware mapping, consult ",{"type":44,"tag":207,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":50,"value":313},{"type":50,"value":2514},".\nPipeline ordering errors produce subtle bugs that are difficult to diagnose.",{"type":44,"tag":60,"props":2516,"children":2517},{},[2518,2522],{"type":44,"tag":66,"props":2519,"children":2520},{},[2521],{"type":50,"value":1027},{"type":50,"value":2523},": Application pipeline behaves equivalently to baseline for\nnon-authenticated requests. All custom middleware registered in correct order.",{"type":44,"tag":216,"props":2525,"children":2526},{},[],{"type":44,"tag":238,"props":2528,"children":2530},{"id":2529},"authentication-and-authorization",[2531],{"type":50,"value":2532},"Authentication and Authorization",{"type":44,"tag":1378,"props":2534,"children":2535},{},[2536,2545],{"type":44,"tag":60,"props":2537,"children":2538},{},[2539,2544],{"type":44,"tag":66,"props":2540,"children":2541},{},[2542],{"type":50,"value":2543},"Load satellite before this phase",{"type":50,"value":1441},{"type":44,"tag":74,"props":2546,"children":2547},{},[2548],{"type":44,"tag":78,"props":2549,"children":2550},{},[2551,2556],{"type":44,"tag":207,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":50,"value":400},{"type":50,"value":2557}," — always load for this phase when any auth is present.\nAuth is security-critical and has multiple distinct migration paths.\nDo not proceed based on general knowledge alone.",{"type":44,"tag":1378,"props":2559,"children":2560},{},[2561],{"type":44,"tag":60,"props":2562,"children":2563},{},[2564],{"type":50,"value":2565},"Execute this step after the pipeline is stable (middleware migration complete).\nAuth is the hardest to debug when the pipeline is uncertain.",{"type":44,"tag":60,"props":2567,"children":2568},{},[2569],{"type":50,"value":2570},"High-level path selection (satellite provides full detail for each):",{"type":44,"tag":119,"props":2572,"children":2573},{},[2574,2590],{"type":44,"tag":123,"props":2575,"children":2576},{},[2577],{"type":44,"tag":127,"props":2578,"children":2579},{},[2580,2585],{"type":44,"tag":131,"props":2581,"children":2582},{},[2583],{"type":50,"value":2584},"Detected auth mechanism",{"type":44,"tag":131,"props":2586,"children":2587},{},[2588],{"type":50,"value":2589},"Migration path",{"type":44,"tag":147,"props":2591,"children":2592},{},[2593,2610,2634,2665,2678,2691,2715],{"type":44,"tag":127,"props":2594,"children":2595},{},[2596,2605],{"type":44,"tag":154,"props":2597,"children":2598},{},[2599],{"type":44,"tag":207,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":50,"value":2604},"FormsAuthentication",{"type":44,"tag":154,"props":2606,"children":2607},{},[2608],{"type":50,"value":2609},"Cookie authentication middleware",{"type":44,"tag":127,"props":2611,"children":2612},{},[2613,2629],{"type":44,"tag":154,"props":2614,"children":2615},{},[2616,2622,2623],{"type":44,"tag":207,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":50,"value":2621},"SqlMembership",{"type":50,"value":996},{"type":44,"tag":207,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":50,"value":2628},"SimpleMembership",{"type":44,"tag":154,"props":2630,"children":2631},{},[2632],{"type":50,"value":2633},"ASP.NET Core Identity (schema migration required)",{"type":44,"tag":127,"props":2635,"children":2636},{},[2637,2648],{"type":44,"tag":154,"props":2638,"children":2639},{},[2640,2642],{"type":50,"value":2641},"Custom ",{"type":44,"tag":207,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":50,"value":2647},"MembershipProvider",{"type":44,"tag":154,"props":2649,"children":2650},{},[2651,2652,2658,2659],{"type":50,"value":2641},{"type":44,"tag":207,"props":2653,"children":2655},{"className":2654},[],[2656],{"type":50,"value":2657},"IUserStore\u003CT>",{"type":50,"value":2054},{"type":44,"tag":207,"props":2660,"children":2662},{"className":2661},[],[2663],{"type":50,"value":2664},"IAuthenticationHandler",{"type":44,"tag":127,"props":2666,"children":2667},{},[2668,2673],{"type":44,"tag":154,"props":2669,"children":2670},{},[2671],{"type":50,"value":2672},"Windows Authentication",{"type":44,"tag":154,"props":2674,"children":2675},{},[2676],{"type":50,"value":2677},"Negotiate middleware",{"type":44,"tag":127,"props":2679,"children":2680},{},[2681,2686],{"type":44,"tag":154,"props":2682,"children":2683},{},[2684],{"type":50,"value":2685},"OWIN OAuth \u002F token server",{"type":44,"tag":154,"props":2687,"children":2688},{},[2689],{"type":50,"value":2690},"IdentityServer \u002F Duende \u002F OpenIddict",{"type":44,"tag":127,"props":2692,"children":2693},{},[2694,2706],{"type":44,"tag":154,"props":2695,"children":2696},{},[2697,2698,2704],{"type":50,"value":2641},{"type":44,"tag":207,"props":2699,"children":2701},{"className":2700},[],[2702],{"type":50,"value":2703},"IPrincipal",{"type":50,"value":2705}," \u002F claims",{"type":44,"tag":154,"props":2707,"children":2708},{},[2709],{"type":44,"tag":207,"props":2710,"children":2712},{"className":2711},[],[2713],{"type":50,"value":2714},"IClaimsTransformation",{"type":44,"tag":127,"props":2716,"children":2717},{},[2718,2729],{"type":44,"tag":154,"props":2719,"children":2720},{},[2721,2727],{"type":44,"tag":207,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":50,"value":2726},"Web.config \u003Cauthorization>",{"type":50,"value":2728}," rules",{"type":44,"tag":154,"props":2730,"children":2731},{},[2732],{"type":50,"value":2733},"Policy-based authorization",{"type":44,"tag":60,"props":2735,"children":2736},{},[2737,2741],{"type":44,"tag":66,"props":2738,"children":2739},{},[2740],{"type":50,"value":1027},{"type":50,"value":2742},": Authenticated and unauthenticated request flows match baseline.\nRun the full auth rules inventory from baseline capture as acceptance checklist.",{"type":44,"tag":216,"props":2744,"children":2745},{},[],{"type":44,"tag":238,"props":2747,"children":2749},{"id":2748},"views-and-static-assets-mvc-projects-only",[2750],{"type":50,"value":2751},"Views and Static Assets (MVC projects only)",{"type":44,"tag":1378,"props":2753,"children":2754},{},[2755,2763],{"type":44,"tag":60,"props":2756,"children":2757},{},[2758,2762],{"type":44,"tag":66,"props":2759,"children":2760},{},[2761],{"type":50,"value":2543},{"type":50,"value":1441},{"type":44,"tag":74,"props":2764,"children":2765},{},[2766],{"type":44,"tag":78,"props":2767,"children":2768},{},[2769,2774,2775,2780,2781,2786,2787,2792,2793,2798,2799,2805,2806],{"type":44,"tag":207,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":50,"value":785},{"type":50,"value":1494},{"type":44,"tag":207,"props":2776,"children":2778},{"className":2777},[],[2779],{"type":50,"value":757},{"type":50,"value":284},{"type":44,"tag":207,"props":2782,"children":2784},{"className":2783},[],[2785],{"type":50,"value":764},{"type":50,"value":284},{"type":44,"tag":207,"props":2788,"children":2790},{"className":2789},[],[2791],{"type":50,"value":655},{"type":50,"value":1473},{"type":44,"tag":207,"props":2794,"children":2796},{"className":2795},[],[2797],{"type":50,"value":648},{"type":50,"value":284},{"type":44,"tag":207,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":50,"value":2804},"UsesDisplayTemplates",{"type":50,"value":284},{"type":44,"tag":207,"props":2807,"children":2809},{"className":2808},[],[2810],{"type":50,"value":2811},"UsesEditorTemplates",{"type":44,"tag":60,"props":2813,"children":2814},{},[2815],{"type":50,"value":2816},"High-level checklist (satellite provides full detail):",{"type":44,"tag":74,"props":2818,"children":2819},{},[2820,2839,2866,2879,2892,2917,2933,2938,2950],{"type":44,"tag":78,"props":2821,"children":2822},{},[2823,2824,2830,2831,2837],{"type":50,"value":1072},{"type":44,"tag":207,"props":2825,"children":2827},{"className":2826},[],[2828],{"type":50,"value":2829},"@Scripts.Render",{"type":50,"value":996},{"type":44,"tag":207,"props":2832,"children":2834},{"className":2833},[],[2835],{"type":50,"value":2836},"@Styles.Render",{"type":50,"value":2838}," calls — no built-in equivalent",{"type":44,"tag":78,"props":2840,"children":2841},{},[2842,2844,2850,2852,2858,2859,2865],{"type":50,"value":2843},"Replace common ",{"type":44,"tag":207,"props":2845,"children":2847},{"className":2846},[],[2848],{"type":50,"value":2849},"HtmlHelper",{"type":50,"value":2851}," calls with Tag Helpers (",{"type":44,"tag":207,"props":2853,"children":2855},{"className":2854},[],[2856],{"type":50,"value":2857},"Html.ActionLink",{"type":50,"value":1234},{"type":44,"tag":207,"props":2860,"children":2862},{"className":2861},[],[2863],{"type":50,"value":2864},"\u003Ca asp-*>",{"type":50,"value":1099},{"type":44,"tag":78,"props":2867,"children":2868},{},[2869,2871,2877],{"type":50,"value":2870},"Convert child actions (",{"type":44,"tag":207,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":50,"value":2876},"Html.Action()",{"type":50,"value":2878},") to View Components",{"type":44,"tag":78,"props":2880,"children":2881},{},[2882,2884,2890],{"type":50,"value":2883},"Convert ",{"type":44,"tag":207,"props":2885,"children":2887},{"className":2886},[],[2888],{"type":50,"value":2889},"@helper",{"type":50,"value":2891}," Razor helpers to partial views or Tag Helpers",{"type":44,"tag":78,"props":2893,"children":2894},{},[2895,2897,2903,2904,2910,2911],{"type":50,"value":2896},"Move static files from ",{"type":44,"tag":207,"props":2898,"children":2900},{"className":2899},[],[2901],{"type":50,"value":2902},"Content\u002F",{"type":50,"value":945},{"type":44,"tag":207,"props":2905,"children":2907},{"className":2906},[],[2908],{"type":50,"value":2909},"Scripts\u002F",{"type":50,"value":2062},{"type":44,"tag":207,"props":2912,"children":2914},{"className":2913},[],[2915],{"type":50,"value":2916},"wwwroot\u002F",{"type":44,"tag":78,"props":2918,"children":2919},{},[2920,2921,2927,2928],{"type":50,"value":1586},{"type":44,"tag":207,"props":2922,"children":2924},{"className":2923},[],[2925],{"type":50,"value":2926},"app.UseStaticFiles()",{"type":50,"value":2062},{"type":44,"tag":207,"props":2929,"children":2931},{"className":2930},[],[2932],{"type":50,"value":1148},{"type":44,"tag":78,"props":2934,"children":2935},{},[2936],{"type":50,"value":2937},"Choose and configure bundling approach (WebOptimizer, npm pipeline, or direct references)",{"type":44,"tag":78,"props":2939,"children":2940},{},[2941,2942,2948],{"type":50,"value":1586},{"type":44,"tag":207,"props":2943,"children":2945},{"className":2944},[],[2946],{"type":50,"value":2947},"_ViewImports.cshtml",{"type":50,"value":2949}," with Tag Helper namespace imports",{"type":44,"tag":78,"props":2951,"children":2952},{},[2953,2955,2961],{"type":50,"value":2954},"Verify ",{"type":44,"tag":207,"props":2956,"children":2958},{"className":2957},[],[2959],{"type":50,"value":2960},"_ViewStart.cshtml",{"type":50,"value":2962}," layout reference is correct",{"type":44,"tag":60,"props":2964,"children":2965},{},[2966,2970,2972,2977,2979,2984],{"type":44,"tag":66,"props":2967,"children":2968},{},[2969],{"type":50,"value":1027},{"type":50,"value":2971},": All views render without errors. Static assets load. No ",{"type":44,"tag":207,"props":2973,"children":2975},{"className":2974},[],[2976],{"type":50,"value":2829},{"type":50,"value":2978},"\nor ",{"type":44,"tag":207,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":50,"value":2836},{"type":50,"value":2985}," references remain.",{"type":44,"tag":216,"props":2987,"children":2988},{},[],{"type":44,"tag":238,"props":2990,"children":2992},{"id":2991},"cleanup-and-verification",[2993],{"type":50,"value":2994},"Cleanup and Verification",{"type":44,"tag":74,"props":2996,"children":2997},{},[2998,3011,3023,3053,3064],{"type":44,"tag":78,"props":2999,"children":3000},{},[3001,3003,3009],{"type":50,"value":3002},"Remove all ",{"type":44,"tag":207,"props":3004,"children":3006},{"className":3005},[],[3007],{"type":50,"value":3008},"#if NETFRAMEWORK",{"type":50,"value":3010}," conditional blocks",{"type":44,"tag":78,"props":3012,"children":3013},{},[3014,3016,3021],{"type":50,"value":3015},"Remove remaining ",{"type":44,"tag":207,"props":3017,"children":3019},{"className":3018},[],[3020],{"type":50,"value":1109},{"type":50,"value":3022}," references if any remain (there should be none)",{"type":44,"tag":78,"props":3024,"children":3025},{},[3026,3027,3032,3033,3038,3039,3044,3045,3051],{"type":50,"value":1072},{"type":44,"tag":207,"props":3028,"children":3030},{"className":3029},[],[3031],{"type":50,"value":1963},{"type":50,"value":284},{"type":44,"tag":207,"props":3034,"children":3036},{"className":3035},[],[3037],{"type":50,"value":1956},{"type":50,"value":284},{"type":44,"tag":207,"props":3040,"children":3042},{"className":3041},[],[3043],{"type":50,"value":1975},{"type":50,"value":284},{"type":44,"tag":207,"props":3046,"children":3048},{"className":3047},[],[3049],{"type":50,"value":3050},"BundleConfig.cs",{"type":50,"value":3052},"\nfrom old project's code that was copied to new project",{"type":44,"tag":78,"props":3054,"children":3055},{},[3056,3057,3062],{"type":50,"value":1072},{"type":44,"tag":207,"props":3058,"children":3060},{"className":3059},[],[3061],{"type":50,"value":1078},{"type":50,"value":3063}," if not already done",{"type":44,"tag":78,"props":3065,"children":3066},{},[3067],{"type":50,"value":3068},"Remove unused compatibility shims or adapter layers added during migration",{"type":44,"tag":1378,"props":3070,"children":3071},{},[3072],{"type":44,"tag":60,"props":3073,"children":3074},{},[3075,3080],{"type":44,"tag":66,"props":3076,"children":3077},{},[3078],{"type":50,"value":3079},"Do NOT delete the old Framework project.",{"type":50,"value":3081}," In side-by-side mode, the old\nproject stays in the solution. Physical removal is a post-upgrade step for\nthe user. In in-place mode, this section cleans up the converted project.",{"type":44,"tag":60,"props":3083,"children":3084},{},[3085,3090],{"type":44,"tag":66,"props":3086,"children":3087},{},[3088],{"type":50,"value":3089},"Verify against baseline",{"type":50,"value":1441},{"type":44,"tag":74,"props":3092,"children":3095},{"className":3093},[3094],"contains-task-list",[3096,3109,3118,3127,3151,3160,3169],{"type":44,"tag":78,"props":3097,"children":3100},{"className":3098},[3099],"task-list-item",[3101,3107],{"type":44,"tag":3102,"props":3103,"children":3106},"input",{"disabled":3104,"type":3105},true,"checkbox",[],{"type":50,"value":3108}," All endpoints return expected status codes",{"type":44,"tag":78,"props":3110,"children":3112},{"className":3111},[3099],[3113,3116],{"type":44,"tag":3102,"props":3114,"children":3115},{"disabled":3104,"type":3105},[],{"type":50,"value":3117}," Authentication flows work end to end (each auth rule from baseline)",{"type":44,"tag":78,"props":3119,"children":3121},{"className":3120},[3099],[3122,3125],{"type":44,"tag":3102,"props":3123,"children":3124},{"disabled":3104,"type":3105},[],{"type":50,"value":3126}," All configuration values load correctly",{"type":44,"tag":78,"props":3128,"children":3130},{"className":3129},[3099],[3131,3134,3136,3141,3143,3149],{"type":44,"tag":3102,"props":3132,"children":3133},{"disabled":3104,"type":3105},[],{"type":50,"value":3135}," No ",{"type":44,"tag":207,"props":3137,"children":3139},{"className":3138},[],[3140],{"type":50,"value":1109},{"type":50,"value":3142}," references remain (",{"type":44,"tag":207,"props":3144,"children":3146},{"className":3145},[],[3147],{"type":50,"value":3148},"dotnet list package",{"type":50,"value":3150}," confirms)",{"type":44,"tag":78,"props":3152,"children":3154},{"className":3153},[3099],[3155,3158],{"type":44,"tag":3102,"props":3156,"children":3157},{"disabled":3104,"type":3105},[],{"type":50,"value":3159}," Solution builds with 0 errors and 0 migration-related warnings",{"type":44,"tag":78,"props":3161,"children":3163},{"className":3162},[3099],[3164,3167],{"type":44,"tag":3102,"props":3165,"children":3166},{"disabled":3104,"type":3105},[],{"type":50,"value":3168}," All tests pass",{"type":44,"tag":78,"props":3170,"children":3172},{"className":3171},[3099],[3173,3176],{"type":44,"tag":3102,"props":3174,"children":3175},{"disabled":3104,"type":3105},[],{"type":50,"value":3177}," Static assets load (MVC projects)",{"type":44,"tag":216,"props":3179,"children":3180},{},[],{"type":44,"tag":53,"props":3182,"children":3184},{"id":3183},"library-dependencies-with-systemweb-references",[3185],{"type":50,"value":3186},"Library Dependencies With System.Web References",{"type":44,"tag":60,"props":3188,"children":3189},{},[3190,3192,3197],{"type":50,"value":3191},"If the task scope includes class libraries that reference ",{"type":44,"tag":207,"props":3193,"children":3195},{"className":3194},[],[3196],{"type":50,"value":1109},{"type":50,"value":1441},{"type":44,"tag":74,"props":3199,"children":3200},{},[3201,3206,3218,3223],{"type":44,"tag":78,"props":3202,"children":3203},{},[3204],{"type":50,"value":3205},"Apply config, DI, controllers, middleware, auth steps only — no project setup, no views",{"type":44,"tag":78,"props":3207,"children":3208},{},[3209,3211,3216],{"type":50,"value":3210},"Primary concern: replace ",{"type":44,"tag":207,"props":3212,"children":3214},{"className":3213},[],[3215],{"type":50,"value":1109},{"type":50,"value":3217}," API surface with abstractions injectable via DI",{"type":44,"tag":78,"props":3219,"children":3220},{},[3221],{"type":50,"value":3222},"Migrate before the web project that consumes them — they must be clean before controller migration",{"type":44,"tag":78,"props":3224,"children":3225},{},[3226,3228],{"type":50,"value":3227},"Common patterns requiring architectural discussion (not just API swap):\n",{"type":44,"tag":74,"props":3229,"children":3230},{},[3231,3247,3258],{"type":44,"tag":78,"props":3232,"children":3233},{},[3234,3239,3241,3246],{"type":44,"tag":207,"props":3235,"children":3237},{"className":3236},[],[3238],{"type":50,"value":994},{"type":50,"value":3240}," in a library — load ",{"type":44,"tag":207,"props":3242,"children":3244},{"className":3243},[],[3245],{"type":50,"value":346},{"type":50,"value":2175},{"type":44,"tag":78,"props":3248,"children":3249},{},[3250,3256],{"type":44,"tag":207,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":50,"value":3255},"HttpServerUtility",{"type":50,"value":3257}," usage — no direct equivalent, method-by-method replacement needed",{"type":44,"tag":78,"props":3259,"children":3260},{},[3261,3263,3269,3271,3276],{"type":50,"value":3262},"Static auth access (",{"type":44,"tag":207,"props":3264,"children":3266},{"className":3265},[],[3267],{"type":50,"value":3268},"HttpContext.Current.User",{"type":50,"value":3270},") — requires ",{"type":44,"tag":207,"props":3272,"children":3274},{"className":3273},[],[3275],{"type":50,"value":1592},{"type":50,"value":3277}," threading care",{"type":44,"tag":216,"props":3279,"children":3280},{},[],{"type":44,"tag":53,"props":3282,"children":3284},{"id":3283},"mode-reference",[3285],{"type":50,"value":3286},"Mode Reference",{"type":44,"tag":238,"props":3288,"children":3290},{"id":3289},"in-place-mode",[3291],{"type":50,"value":3292},"In-Place Mode",{"type":44,"tag":60,"props":3294,"children":3295},{},[3296],{"type":50,"value":3297},"All migration steps execute sequentially within a single project upgrade task.\nNo task boundaries between steps.",{"type":44,"tag":238,"props":3299,"children":3301},{"id":3300},"side-by-side-mode-project-approach-side-by-side",[3302],{"type":50,"value":3303},"Side-by-Side Mode (Project Approach = Side-by-side)",{"type":44,"tag":60,"props":3305,"children":3306},{},[3307,3315],{"type":44,"tag":66,"props":3308,"children":3309},{},[3310,3311],{"type":50,"value":192},{"type":44,"tag":194,"props":3312,"children":3313},{"href":196},[3314],{"type":50,"value":196},{"type":50,"value":3316}," for the complete scaffold\u002Fmigrate\ntask structure, scaffold checklist, and controller migration subtask ordering.\nOld project is not deleted — removal is a post-upgrade step for the user.",{"items":3318,"total":3407},[3319,3329,3343,3360,3370,3377,3394],{"slug":3320,"name":3320,"fn":3321,"description":3322,"org":3323,"tags":3324,"stars":25,"repoUrl":26,"updatedAt":3328},"converting-to-cpm","migrate .NET projects to Central Package Management","Converts .NET projects and solutions to NuGet Central Package Management (CPM) with Directory.Packages.props. Use when the user wants to centralize, convert, align, or sync NuGet package versions across multiple projects, resolve version conflicts or mismatches, or get versions consistent across a solution or repository. Also triggers when packages are out of sync or drifting across projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3325,3326,3327],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},"2026-07-18T05:14:13.971821",{"slug":3330,"name":3330,"fn":3331,"description":3332,"org":3333,"tags":3334,"stars":25,"repoUrl":26,"updatedAt":3342},"creating-winforms-custom-controls","create custom WinForms controls","Creates custom controls and UserControls for modern WinForms (.NET 6+). Use when deriving from Control, UserControl, Button, TextBox, or other base controls, implementing custom rendering with OnPaint overrides, creating composite controls with child control composition, adding custom properties with [Browsable], [Category], or [DefaultValue] attributes for Designer support, implementing INotifyPropertyChanged for control properties, handling Layout\u002FLayoutEngine for custom sizing, creating scrollable controls with AutoScrollMinSize, implementing dark mode theming, or building List\u002FGrid\u002FTree-like controls. Also triggers for \"custom UserControl\", \"derive from Control\", \"owner-drawn control\", \"Designer properties\", \"[Browsable] attribute\", \"custom WinForms control\", \"LayoutEngine\", \"AutoScroll control\", and \"themed control\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3335,3336,3339],{"name":17,"slug":18,"type":15},{"name":3337,"slug":3338,"type":15},"Windows","windows",{"name":3340,"slug":3341,"type":15},"WinUI","winui","2026-07-03T16:31:30.1325",{"slug":3344,"name":3344,"fn":3345,"description":3346,"org":3347,"tags":3348,"stars":25,"repoUrl":26,"updatedAt":3359},"managing-winforms-high-dpi-layout","design high-DPI responsive WinForms layouts","Implements WinForms high-DPI fluent layouts using TableLayoutPanel, FlowLayoutPanel, and DPI-aware design patterns. Use when creating responsive form layouts that must scale across different DPI settings, implementing Per Monitor V2 (PerMonitorV2) DPI awareness, working with TableLayoutPanel.RowStyles\u002FColumnStyles, using FlowLayoutPanel for dynamic layouts, replacing fixed pixel positioning with container-based layout, troubleshooting DPI scaling issues, or structuring nested layout containers. Also triggers for \"TableLayoutPanel\", \"FlowLayoutPanel\", \"high DPI WinForms\", \"PerMonitorV2\", \"DPI aware layout\", \"responsive WinForms\", \"scale UI\", \"AutoScaleMode\", and \"DPI scaling\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3349,3352,3355,3358],{"name":3350,"slug":3351,"type":15},"Design","design",{"name":3353,"slug":3354,"type":15},"Desktop","desktop",{"name":3356,"slug":3357,"type":15},"UI Components","ui-components",{"name":3337,"slug":3338,"type":15},"2026-07-18T05:14:12.982806",{"slug":3361,"name":3361,"fn":3362,"description":3363,"org":3364,"tags":3365,"stars":25,"repoUrl":26,"updatedAt":3369},"managing-winforms-mvvm","implement MVVM pattern in WinForms","Implements MVVM pattern in WinForms applications (.NET 8+) with ViewModels, Commands, and DataContext. Use when user explicitly requests MVVM implementation, setting up ViewModel with INotifyPropertyChanged or ObservableObject, implementing ICommand or RelayCommand, wiring Form.DataContext, binding controls to ViewModel properties, creating Commands for button clicks, or separating business logic from UI code. Also triggers for \"WinForms MVVM\", \"ViewModel in WinForms\", \"INotifyPropertyChanged\", \"DataContext binding\", \"Command pattern WinForms\", \"ObservableObject\", \"RelayCommand\", and \"testable WinForms\". Also use when fixing existing MVVM code or when guided by winforms-feature-adoption scenario. DO NOT USE FOR: automatic application during version upgrades (opt-in only).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3366,3367,3368],{"name":17,"slug":18,"type":15},{"name":3337,"slug":3338,"type":15},{"name":3340,"slug":3341,"type":15},"2026-07-18T05:14:11.951511",{"slug":4,"name":4,"fn":5,"description":6,"org":3371,"tags":3372,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3373,3374,3375,3376],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"slug":3378,"name":3378,"fn":3379,"description":3380,"org":3381,"tags":3382,"stars":25,"repoUrl":26,"updatedAt":3393},"migrating-documentdb-to-cosmos","migrate DocumentDB to Cosmos DB","Migrates from the deprecated Microsoft.Azure.DocumentDB SDK (V2) to the modern Microsoft.Azure.Cosmos SDK (V3) for Azure Cosmos DB. Use ONLY when Microsoft.Azure.DocumentDB has been flagged as deprecated or obsolete and must be replaced — not for version-bump scenarios where the V2 SDK is still supported.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3383,3386,3389,3392],{"name":3384,"slug":3385,"type":15},"Azure","azure",{"name":3387,"slug":3388,"type":15},"Cosmos DB","cosmos-db",{"name":3390,"slug":3391,"type":15},"Database","database",{"name":23,"slug":24,"type":15},"2026-07-03T16:31:21.932144",{"slug":306,"name":306,"fn":3395,"description":3396,"org":3397,"tags":3398,"stars":25,"repoUrl":26,"updatedAt":3406},"migrate Global.asax to ASP.NET Core middleware","Migrates Global.asax application lifecycle events to ASP.NET Core middleware, startup configuration, and Program.cs. Use when upgrading ASP.NET Framework apps containing Global.asax or Global.asax.cs files. Triggers for \"migrate Global.asax\", \"convert application events\", \"move Application_Start to Program.cs\", \"replace Global.asax with middleware\", and ASP.NET-to-Core migration involving request lifecycle, error handling, or session management.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3399,3401,3402,3403],{"name":20,"slug":3400,"type":15},"aspnet-core",{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},{"name":3404,"slug":3405,"type":15},"Modernization","modernization","2026-07-07T06:54:34.226435",19,{"items":3409,"total":3594},[3410,3432,3449,3470,3485,3502,3513,3526,3541,3554,3569,3582],{"slug":3411,"name":3411,"fn":3412,"description":3413,"org":3414,"tags":3415,"stars":3429,"repoUrl":3430,"updatedAt":3431},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3416,3419,3422,3423,3426],{"name":3417,"slug":3418,"type":15},"Engineering","engineering",{"name":3420,"slug":3421,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":3424,"slug":3425,"type":15},"Project Management","project-management",{"name":3427,"slug":3428,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":3433,"name":3433,"fn":3434,"description":3435,"org":3436,"tags":3437,"stars":3446,"repoUrl":3447,"updatedAt":3448},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3438,3439,3442,3443],{"name":17,"slug":18,"type":15},{"name":3440,"slug":3441,"type":15},"Agents","agents",{"name":3384,"slug":3385,"type":15},{"name":3444,"slug":3445,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":3450,"name":3450,"fn":3451,"description":3452,"org":3453,"tags":3454,"stars":3446,"repoUrl":3447,"updatedAt":3469},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3455,3458,3459,3462,3465,3466],{"name":3456,"slug":3457,"type":15},"Analytics","analytics",{"name":3384,"slug":3385,"type":15},{"name":3460,"slug":3461,"type":15},"Data Analysis","data-analysis",{"name":3463,"slug":3464,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":3467,"slug":3468,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":3471,"name":3471,"fn":3472,"description":3473,"org":3474,"tags":3475,"stars":3446,"repoUrl":3447,"updatedAt":3484},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3476,3479,3480,3481],{"name":3477,"slug":3478,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3384,"slug":3385,"type":15},{"name":3463,"slug":3464,"type":15},{"name":3482,"slug":3483,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":3486,"name":3486,"fn":3487,"description":3488,"org":3489,"tags":3490,"stars":3446,"repoUrl":3447,"updatedAt":3501},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3491,3492,3495,3496,3497,3500],{"name":3384,"slug":3385,"type":15},{"name":3493,"slug":3494,"type":15},"Compliance","compliance",{"name":3444,"slug":3445,"type":15},{"name":9,"slug":8,"type":15},{"name":3498,"slug":3499,"type":15},"Python","python",{"name":3482,"slug":3483,"type":15},"2026-07-18T05:14:23.017504",{"slug":3503,"name":3503,"fn":3504,"description":3505,"org":3506,"tags":3507,"stars":3446,"repoUrl":3447,"updatedAt":3512},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3508,3509,3510,3511],{"name":3456,"slug":3457,"type":15},{"name":3384,"slug":3385,"type":15},{"name":3444,"slug":3445,"type":15},{"name":3498,"slug":3499,"type":15},"2026-07-31T05:54:29.068751",{"slug":3514,"name":3514,"fn":3515,"description":3516,"org":3517,"tags":3518,"stars":3446,"repoUrl":3447,"updatedAt":3525},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3519,3522,3523,3524],{"name":3520,"slug":3521,"type":15},"API Development","api-development",{"name":3384,"slug":3385,"type":15},{"name":9,"slug":8,"type":15},{"name":3498,"slug":3499,"type":15},"2026-07-18T05:14:16.988376",{"slug":3527,"name":3527,"fn":3528,"description":3529,"org":3530,"tags":3531,"stars":3446,"repoUrl":3447,"updatedAt":3540},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3532,3533,3536,3539],{"name":3384,"slug":3385,"type":15},{"name":3534,"slug":3535,"type":15},"Computer Vision","computer-vision",{"name":3537,"slug":3538,"type":15},"Images","images",{"name":3498,"slug":3499,"type":15},"2026-07-18T05:14:18.007737",{"slug":3542,"name":3542,"fn":3543,"description":3544,"org":3545,"tags":3546,"stars":3446,"repoUrl":3447,"updatedAt":3553},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3547,3548,3549,3552],{"name":3384,"slug":3385,"type":15},{"name":1210,"slug":1207,"type":15},{"name":3550,"slug":3551,"type":15},"Feature Flags","feature-flags",{"name":3463,"slug":3464,"type":15},"2026-07-03T16:32:01.278468",{"slug":3555,"name":3555,"fn":3556,"description":3557,"org":3558,"tags":3559,"stars":3446,"repoUrl":3447,"updatedAt":3568},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3560,3561,3562,3565],{"name":3387,"slug":3388,"type":15},{"name":3390,"slug":3391,"type":15},{"name":3563,"slug":3564,"type":15},"NoSQL","nosql",{"name":3566,"slug":3567,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":3570,"name":3570,"fn":3556,"description":3571,"org":3572,"tags":3573,"stars":3446,"repoUrl":3447,"updatedAt":3581},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3574,3575,3576,3577,3578],{"name":3387,"slug":3388,"type":15},{"name":3390,"slug":3391,"type":15},{"name":9,"slug":8,"type":15},{"name":3563,"slug":3564,"type":15},{"name":3579,"slug":3580,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":3583,"name":3583,"fn":3584,"description":3585,"org":3586,"tags":3587,"stars":3446,"repoUrl":3447,"updatedAt":3593},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3588,3589,3590,3591,3592],{"name":3384,"slug":3385,"type":15},{"name":3387,"slug":3388,"type":15},{"name":3390,"slug":3391,"type":15},{"name":3463,"slug":3464,"type":15},{"name":3563,"slug":3564,"type":15},"2026-05-13T06:14:17.582229",267]