[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-template-smart-defaults":3,"mdc--7phmoy-key":34,"related-repo-dotnet-template-smart-defaults":1000,"related-org-dotnet-template-smart-defaults":1109},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"template-smart-defaults","apply smart defaults to .NET templates","Applies cross-parameter default rules when creating .NET projects with dotnet new, filling gaps consistently without overriding values the user set explicitly. USE FOR: choosing which target framework to pair with native AOT, deciding whether to keep HTTPS when authentication is enabled, recognizing that controllers and minimal-API flags are mutually exclusive, filling unset related parameters during project creation, explaining why a default was applied and ensuring an explicit user value is never overridden. DO NOT USE FOR: creating the project itself (use template-instantiation), finding or comparing templates (use template-discovery and template-comparison), authoring or validating custom templates (use template-authoring and template-validation).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19],{"name":13,"slug":14,"type":15},"Build","build","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Templates","templates",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-22T05:35:40.681392","MIT",332,[28],"agent-skills",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-template-engine\u002Fskills\u002Ftemplate-smart-defaults","---\nname: template-smart-defaults\ndescription: >\n  Applies cross-parameter default rules when creating .NET projects with dotnet new,\n  filling gaps consistently without overriding values the user set explicitly.\n  USE FOR: choosing which target framework to pair with native AOT, deciding whether to\n  keep HTTPS when authentication is enabled, recognizing that controllers and minimal-API\n  flags are mutually exclusive, filling unset related parameters during project creation,\n  explaining why a default was applied and ensuring an explicit user value is never\n  overridden.\n  DO NOT USE FOR: creating the project itself (use template-instantiation), finding or\n  comparing templates (use template-discovery and template-comparison), authoring or\n  validating custom templates (use template-authoring and template-validation).\nlicense: MIT\n---\n\n# Template Smart Defaults\n\nThis skill helps an agent fill in cross-parameter defaults when creating a `dotnet new`\nproject. The rules below are guidance heuristics that keep related parameters consistent —\nthey only fill gaps and never override a value the user set explicitly.\n\n## When to Use\n\n- The user asks to create a project but leaves related parameters unspecified\n- A parameter the user chose implies a sensible value for another parameter\n- You need to explain why a particular default was selected\n\n## When Not to Use\n\n- User wants to actually create the project — route to `template-instantiation`\n- User wants to find or compare templates — route to `template-discovery` or `template-comparison`\n- User wants to author or validate a custom template — route to `template-authoring` or `template-validation`\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Template short name | Yes | The template the project will be created from (e.g., `webapi`) |\n| Parameters already chosen | Yes | The parameter values the user has explicitly set |\n| Available choices | Recommended | Parameter names\u002Fchoices from `dotnet new \u003Ctemplate> --help` |\n\n## Workflow\n\n1. Gather the parameters the user has explicitly set.\n2. Apply each rule below **only where the corresponding parameter is unset** — never override a value the user set explicitly.\n3. Confirm the chosen parameter names and choices against `dotnet new \u003Ctemplate> --help` **at creation time**. For an advice-only request (the user isn't creating yet — e.g. \"tell me the parameters\u002Fcommand\"), answer from the rules below and note you'd confirm the exact names at creation; don't spend a `--help` call just to advise on well-known parameters.\n4. **Emit the two required outputs** (see below) — this is what makes the skill decisive rather than inert.\n\n### Required output\n\nAlways produce **both**, in this order:\n\n**A. A \"Defaults applied\" log** — one row per parameter, covering **both** the explicit values you preserved (`Source = user`) and the gaps you filled by rule (`Source = rule`), so the user can see and override every choice:\n\n| Parameter | Value | Source | Why |\n|-----------|-------|--------|-----|\n| `--framework` | `net10.0` | rule | Native AOT (from `--aot`) needs the latest AOT-capable TFM |\n| `--auth` | `Individual` | user | Explicitly requested — left unchanged |\n\nUse `Source = user` for explicit values (never overridden) and `Source = rule` for gap-fills.\n\n**B. The exact single `dotnet new` command line** you would run — include **only** the flags you are actually passing. Do not list flags you decided *not* to pass (e.g. don't mention `--no-https` when you are keeping HTTPS; don't mention a minimal-API flag when using controllers). Silence on an omitted flag is the correct, decisive signal.\n\n> **AOT at create time vs publish time.** `--aot` is a `dotnet new` flag only on the templates that expose it — always confirm with `dotnet new \u003Ctemplate> --help` rather than assuming a given template does or doesn't offer it. There is no `--publish-aot` template flag — publish-time native AOT is enabled with the MSBuild property `PublishAot=true` (via `dotnet publish` or in the `.csproj`), not through `dotnet new`. Apply the framework rule only when the template actually offers `--aot`.\n\n### Rules\n\n| Rule | Default applied | Rationale |\n|------|-----------------|-----------|\n| `--aot` is set (on any template whose `--help` exposes it) and `--framework` is unset | Set `--framework` to the latest AOT-compatible framework the template offers | Native AOT requires a recent, AOT-capable target framework; using the latest avoids build failures. (A framework already pinned by the workspace or `global.json` counts as set — keep it unless it's incompatible with AOT.) |\n| `--auth` is anything other than `None` | Do NOT pass `--no-https` | Authentication flows (cookies, tokens, redirects) require HTTPS; disabling it breaks auth. |\n| `--use-controllers` is set | Do NOT also pass a minimal-API flag | Controllers and minimal APIs are mutually exclusive program models; passing both is contradictory. |\n| User set a value explicitly | Leave it unchanged | Smart defaults only fill gaps; explicit user intent always wins. |\n\n## Validation\n\n- [ ] A \"Defaults applied\" log was produced with a Source (user\u002Frule) and rationale per row\n- [ ] The exact single `dotnet new` command line was emitted, listing only flags actually passed\n- [ ] No parameter the user set explicitly was overridden\n- [ ] Only unset parameters were filled\n- [ ] Parameter names\u002Fchoices were confirmed against `dotnet new \u003Ctemplate> --help` at creation (for advice-only requests, flagged as to-confirm rather than run eagerly)\n\n## Common Pitfalls\n\n| Pitfall | Solution |\n|---------|----------|\n| Treating heuristics as enforcement | These are guidance rules, not validation. Always confirm against `dotnet new \u003Ctemplate> --help` choices, since parameter names vary by template. |\n| Overriding an explicit user value | Apply a rule only when the target parameter is unset. |\n| Assuming a flag name | The exact flag differs per template — always verify with `--help` (e.g. `--aot` is present only where `--help` lists it; controllers use `--use-controllers`). |\n| Picking a framework the template doesn't support | Use the latest framework that appears in the template's `--framework` choices, not an arbitrary newest version. |\n\n## More Info\n\n- [dotnet new](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Ftools\u002Fdotnet-new) — CLI reference\n- [Native AOT deployment](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdeploying\u002Fnative-aot\u002F) — AOT framework requirements\n",{"data":35,"body":36},{"name":4,"description":6,"license":25},{"type":37,"children":38},"root",[39,47,62,69,89,95,146,152,252,258,317,324,336,368,470,489,529,609,615,770,776,844,850,966,972],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","Template Smart Defaults",{"type":40,"tag":48,"props":49,"children":50},"p",{},[51,53,60],{"type":45,"value":52},"This skill helps an agent fill in cross-parameter defaults when creating a ",{"type":40,"tag":54,"props":55,"children":57},"code",{"className":56},[],[58],{"type":45,"value":59},"dotnet new",{"type":45,"value":61},"\nproject. The rules below are guidance heuristics that keep related parameters consistent —\nthey only fill gaps and never override a value the user set explicitly.",{"type":40,"tag":63,"props":64,"children":66},"h2",{"id":65},"when-to-use",[67],{"type":45,"value":68},"When to Use",{"type":40,"tag":70,"props":71,"children":72},"ul",{},[73,79,84],{"type":40,"tag":74,"props":75,"children":76},"li",{},[77],{"type":45,"value":78},"The user asks to create a project but leaves related parameters unspecified",{"type":40,"tag":74,"props":80,"children":81},{},[82],{"type":45,"value":83},"A parameter the user chose implies a sensible value for another parameter",{"type":40,"tag":74,"props":85,"children":86},{},[87],{"type":45,"value":88},"You need to explain why a particular default was selected",{"type":40,"tag":63,"props":90,"children":92},{"id":91},"when-not-to-use",[93],{"type":45,"value":94},"When Not to Use",{"type":40,"tag":70,"props":96,"children":97},{},[98,109,128],{"type":40,"tag":74,"props":99,"children":100},{},[101,103],{"type":45,"value":102},"User wants to actually create the project — route to ",{"type":40,"tag":54,"props":104,"children":106},{"className":105},[],[107],{"type":45,"value":108},"template-instantiation",{"type":40,"tag":74,"props":110,"children":111},{},[112,114,120,122],{"type":45,"value":113},"User wants to find or compare templates — route to ",{"type":40,"tag":54,"props":115,"children":117},{"className":116},[],[118],{"type":45,"value":119},"template-discovery",{"type":45,"value":121}," or ",{"type":40,"tag":54,"props":123,"children":125},{"className":124},[],[126],{"type":45,"value":127},"template-comparison",{"type":40,"tag":74,"props":129,"children":130},{},[131,133,139,140],{"type":45,"value":132},"User wants to author or validate a custom template — route to ",{"type":40,"tag":54,"props":134,"children":136},{"className":135},[],[137],{"type":45,"value":138},"template-authoring",{"type":45,"value":121},{"type":40,"tag":54,"props":141,"children":143},{"className":142},[],[144],{"type":45,"value":145},"template-validation",{"type":40,"tag":63,"props":147,"children":149},{"id":148},"inputs",[150],{"type":45,"value":151},"Inputs",{"type":40,"tag":153,"props":154,"children":155},"table",{},[156,180],{"type":40,"tag":157,"props":158,"children":159},"thead",{},[160],{"type":40,"tag":161,"props":162,"children":163},"tr",{},[164,170,175],{"type":40,"tag":165,"props":166,"children":167},"th",{},[168],{"type":45,"value":169},"Input",{"type":40,"tag":165,"props":171,"children":172},{},[173],{"type":45,"value":174},"Required",{"type":40,"tag":165,"props":176,"children":177},{},[178],{"type":45,"value":179},"Description",{"type":40,"tag":181,"props":182,"children":183},"tbody",{},[184,211,228],{"type":40,"tag":161,"props":185,"children":186},{},[187,193,198],{"type":40,"tag":188,"props":189,"children":190},"td",{},[191],{"type":45,"value":192},"Template short name",{"type":40,"tag":188,"props":194,"children":195},{},[196],{"type":45,"value":197},"Yes",{"type":40,"tag":188,"props":199,"children":200},{},[201,203,209],{"type":45,"value":202},"The template the project will be created from (e.g., ",{"type":40,"tag":54,"props":204,"children":206},{"className":205},[],[207],{"type":45,"value":208},"webapi",{"type":45,"value":210},")",{"type":40,"tag":161,"props":212,"children":213},{},[214,219,223],{"type":40,"tag":188,"props":215,"children":216},{},[217],{"type":45,"value":218},"Parameters already chosen",{"type":40,"tag":188,"props":220,"children":221},{},[222],{"type":45,"value":197},{"type":40,"tag":188,"props":224,"children":225},{},[226],{"type":45,"value":227},"The parameter values the user has explicitly set",{"type":40,"tag":161,"props":229,"children":230},{},[231,236,241],{"type":40,"tag":188,"props":232,"children":233},{},[234],{"type":45,"value":235},"Available choices",{"type":40,"tag":188,"props":237,"children":238},{},[239],{"type":45,"value":240},"Recommended",{"type":40,"tag":188,"props":242,"children":243},{},[244,246],{"type":45,"value":245},"Parameter names\u002Fchoices from ",{"type":40,"tag":54,"props":247,"children":249},{"className":248},[],[250],{"type":45,"value":251},"dotnet new \u003Ctemplate> --help",{"type":40,"tag":63,"props":253,"children":255},{"id":254},"workflow",[256],{"type":45,"value":257},"Workflow",{"type":40,"tag":259,"props":260,"children":261},"ol",{},[262,267,280,307],{"type":40,"tag":74,"props":263,"children":264},{},[265],{"type":45,"value":266},"Gather the parameters the user has explicitly set.",{"type":40,"tag":74,"props":268,"children":269},{},[270,272,278],{"type":45,"value":271},"Apply each rule below ",{"type":40,"tag":273,"props":274,"children":275},"strong",{},[276],{"type":45,"value":277},"only where the corresponding parameter is unset",{"type":45,"value":279}," — never override a value the user set explicitly.",{"type":40,"tag":74,"props":281,"children":282},{},[283,285,290,292,297,299,305],{"type":45,"value":284},"Confirm the chosen parameter names and choices against ",{"type":40,"tag":54,"props":286,"children":288},{"className":287},[],[289],{"type":45,"value":251},{"type":45,"value":291}," ",{"type":40,"tag":273,"props":293,"children":294},{},[295],{"type":45,"value":296},"at creation time",{"type":45,"value":298},". For an advice-only request (the user isn't creating yet — e.g. \"tell me the parameters\u002Fcommand\"), answer from the rules below and note you'd confirm the exact names at creation; don't spend a ",{"type":40,"tag":54,"props":300,"children":302},{"className":301},[],[303],{"type":45,"value":304},"--help",{"type":45,"value":306}," call just to advise on well-known parameters.",{"type":40,"tag":74,"props":308,"children":309},{},[310,315],{"type":40,"tag":273,"props":311,"children":312},{},[313],{"type":45,"value":314},"Emit the two required outputs",{"type":45,"value":316}," (see below) — this is what makes the skill decisive rather than inert.",{"type":40,"tag":318,"props":319,"children":321},"h3",{"id":320},"required-output",[322],{"type":45,"value":323},"Required output",{"type":40,"tag":48,"props":325,"children":326},{},[327,329,334],{"type":45,"value":328},"Always produce ",{"type":40,"tag":273,"props":330,"children":331},{},[332],{"type":45,"value":333},"both",{"type":45,"value":335},", in this order:",{"type":40,"tag":48,"props":337,"children":338},{},[339,344,346,350,352,358,360,366],{"type":40,"tag":273,"props":340,"children":341},{},[342],{"type":45,"value":343},"A. A \"Defaults applied\" log",{"type":45,"value":345}," — one row per parameter, covering ",{"type":40,"tag":273,"props":347,"children":348},{},[349],{"type":45,"value":333},{"type":45,"value":351}," the explicit values you preserved (",{"type":40,"tag":54,"props":353,"children":355},{"className":354},[],[356],{"type":45,"value":357},"Source = user",{"type":45,"value":359},") and the gaps you filled by rule (",{"type":40,"tag":54,"props":361,"children":363},{"className":362},[],[364],{"type":45,"value":365},"Source = rule",{"type":45,"value":367},"), so the user can see and override every choice:",{"type":40,"tag":153,"props":369,"children":370},{},[371,397],{"type":40,"tag":157,"props":372,"children":373},{},[374],{"type":40,"tag":161,"props":375,"children":376},{},[377,382,387,392],{"type":40,"tag":165,"props":378,"children":379},{},[380],{"type":45,"value":381},"Parameter",{"type":40,"tag":165,"props":383,"children":384},{},[385],{"type":45,"value":386},"Value",{"type":40,"tag":165,"props":388,"children":389},{},[390],{"type":45,"value":391},"Source",{"type":40,"tag":165,"props":393,"children":394},{},[395],{"type":45,"value":396},"Why",{"type":40,"tag":181,"props":398,"children":399},{},[400,439],{"type":40,"tag":161,"props":401,"children":402},{},[403,412,421,426],{"type":40,"tag":188,"props":404,"children":405},{},[406],{"type":40,"tag":54,"props":407,"children":409},{"className":408},[],[410],{"type":45,"value":411},"--framework",{"type":40,"tag":188,"props":413,"children":414},{},[415],{"type":40,"tag":54,"props":416,"children":418},{"className":417},[],[419],{"type":45,"value":420},"net10.0",{"type":40,"tag":188,"props":422,"children":423},{},[424],{"type":45,"value":425},"rule",{"type":40,"tag":188,"props":427,"children":428},{},[429,431,437],{"type":45,"value":430},"Native AOT (from ",{"type":40,"tag":54,"props":432,"children":434},{"className":433},[],[435],{"type":45,"value":436},"--aot",{"type":45,"value":438},") needs the latest AOT-capable TFM",{"type":40,"tag":161,"props":440,"children":441},{},[442,451,460,465],{"type":40,"tag":188,"props":443,"children":444},{},[445],{"type":40,"tag":54,"props":446,"children":448},{"className":447},[],[449],{"type":45,"value":450},"--auth",{"type":40,"tag":188,"props":452,"children":453},{},[454],{"type":40,"tag":54,"props":455,"children":457},{"className":456},[],[458],{"type":45,"value":459},"Individual",{"type":40,"tag":188,"props":461,"children":462},{},[463],{"type":45,"value":464},"user",{"type":40,"tag":188,"props":466,"children":467},{},[468],{"type":45,"value":469},"Explicitly requested — left unchanged",{"type":40,"tag":48,"props":471,"children":472},{},[473,475,480,482,487],{"type":45,"value":474},"Use ",{"type":40,"tag":54,"props":476,"children":478},{"className":477},[],[479],{"type":45,"value":357},{"type":45,"value":481}," for explicit values (never overridden) and ",{"type":40,"tag":54,"props":483,"children":485},{"className":484},[],[486],{"type":45,"value":365},{"type":45,"value":488}," for gap-fills.",{"type":40,"tag":48,"props":490,"children":491},{},[492,504,506,511,513,519,521,527],{"type":40,"tag":273,"props":493,"children":494},{},[495,497,502],{"type":45,"value":496},"B. The exact single ",{"type":40,"tag":54,"props":498,"children":500},{"className":499},[],[501],{"type":45,"value":59},{"type":45,"value":503}," command line",{"type":45,"value":505}," you would run — include ",{"type":40,"tag":273,"props":507,"children":508},{},[509],{"type":45,"value":510},"only",{"type":45,"value":512}," the flags you are actually passing. Do not list flags you decided ",{"type":40,"tag":514,"props":515,"children":516},"em",{},[517],{"type":45,"value":518},"not",{"type":45,"value":520}," to pass (e.g. don't mention ",{"type":40,"tag":54,"props":522,"children":524},{"className":523},[],[525],{"type":45,"value":526},"--no-https",{"type":45,"value":528}," when you are keeping HTTPS; don't mention a minimal-API flag when using controllers). Silence on an omitted flag is the correct, decisive signal.",{"type":40,"tag":530,"props":531,"children":532},"blockquote",{},[533],{"type":40,"tag":48,"props":534,"children":535},{},[536,541,542,547,549,554,556,561,563,569,571,577,579,585,587,593,595,600,602,607],{"type":40,"tag":273,"props":537,"children":538},{},[539],{"type":45,"value":540},"AOT at create time vs publish time.",{"type":45,"value":291},{"type":40,"tag":54,"props":543,"children":545},{"className":544},[],[546],{"type":45,"value":436},{"type":45,"value":548}," is a ",{"type":40,"tag":54,"props":550,"children":552},{"className":551},[],[553],{"type":45,"value":59},{"type":45,"value":555}," flag only on the templates that expose it — always confirm with ",{"type":40,"tag":54,"props":557,"children":559},{"className":558},[],[560],{"type":45,"value":251},{"type":45,"value":562}," rather than assuming a given template does or doesn't offer it. There is no ",{"type":40,"tag":54,"props":564,"children":566},{"className":565},[],[567],{"type":45,"value":568},"--publish-aot",{"type":45,"value":570}," template flag — publish-time native AOT is enabled with the MSBuild property ",{"type":40,"tag":54,"props":572,"children":574},{"className":573},[],[575],{"type":45,"value":576},"PublishAot=true",{"type":45,"value":578}," (via ",{"type":40,"tag":54,"props":580,"children":582},{"className":581},[],[583],{"type":45,"value":584},"dotnet publish",{"type":45,"value":586}," or in the ",{"type":40,"tag":54,"props":588,"children":590},{"className":589},[],[591],{"type":45,"value":592},".csproj",{"type":45,"value":594},"), not through ",{"type":40,"tag":54,"props":596,"children":598},{"className":597},[],[599],{"type":45,"value":59},{"type":45,"value":601},". Apply the framework rule only when the template actually offers ",{"type":40,"tag":54,"props":603,"children":605},{"className":604},[],[606],{"type":45,"value":436},{"type":45,"value":608},".",{"type":40,"tag":318,"props":610,"children":612},{"id":611},"rules",[613],{"type":45,"value":614},"Rules",{"type":40,"tag":153,"props":616,"children":617},{},[618,639],{"type":40,"tag":157,"props":619,"children":620},{},[621],{"type":40,"tag":161,"props":622,"children":623},{},[624,629,634],{"type":40,"tag":165,"props":625,"children":626},{},[627],{"type":45,"value":628},"Rule",{"type":40,"tag":165,"props":630,"children":631},{},[632],{"type":45,"value":633},"Default applied",{"type":40,"tag":165,"props":635,"children":636},{},[637],{"type":45,"value":638},"Rationale",{"type":40,"tag":181,"props":640,"children":641},{},[642,694,728,752],{"type":40,"tag":161,"props":643,"children":644},{},[645,669,681],{"type":40,"tag":188,"props":646,"children":647},{},[648,653,655,660,662,667],{"type":40,"tag":54,"props":649,"children":651},{"className":650},[],[652],{"type":45,"value":436},{"type":45,"value":654}," is set (on any template whose ",{"type":40,"tag":54,"props":656,"children":658},{"className":657},[],[659],{"type":45,"value":304},{"type":45,"value":661}," exposes it) and ",{"type":40,"tag":54,"props":663,"children":665},{"className":664},[],[666],{"type":45,"value":411},{"type":45,"value":668}," is unset",{"type":40,"tag":188,"props":670,"children":671},{},[672,674,679],{"type":45,"value":673},"Set ",{"type":40,"tag":54,"props":675,"children":677},{"className":676},[],[678],{"type":45,"value":411},{"type":45,"value":680}," to the latest AOT-compatible framework the template offers",{"type":40,"tag":188,"props":682,"children":683},{},[684,686,692],{"type":45,"value":685},"Native AOT requires a recent, AOT-capable target framework; using the latest avoids build failures. (A framework already pinned by the workspace or ",{"type":40,"tag":54,"props":687,"children":689},{"className":688},[],[690],{"type":45,"value":691},"global.json",{"type":45,"value":693}," counts as set — keep it unless it's incompatible with AOT.)",{"type":40,"tag":161,"props":695,"children":696},{},[697,713,723],{"type":40,"tag":188,"props":698,"children":699},{},[700,705,707],{"type":40,"tag":54,"props":701,"children":703},{"className":702},[],[704],{"type":45,"value":450},{"type":45,"value":706}," is anything other than ",{"type":40,"tag":54,"props":708,"children":710},{"className":709},[],[711],{"type":45,"value":712},"None",{"type":40,"tag":188,"props":714,"children":715},{},[716,718],{"type":45,"value":717},"Do NOT pass ",{"type":40,"tag":54,"props":719,"children":721},{"className":720},[],[722],{"type":45,"value":526},{"type":40,"tag":188,"props":724,"children":725},{},[726],{"type":45,"value":727},"Authentication flows (cookies, tokens, redirects) require HTTPS; disabling it breaks auth.",{"type":40,"tag":161,"props":729,"children":730},{},[731,742,747],{"type":40,"tag":188,"props":732,"children":733},{},[734,740],{"type":40,"tag":54,"props":735,"children":737},{"className":736},[],[738],{"type":45,"value":739},"--use-controllers",{"type":45,"value":741}," is set",{"type":40,"tag":188,"props":743,"children":744},{},[745],{"type":45,"value":746},"Do NOT also pass a minimal-API flag",{"type":40,"tag":188,"props":748,"children":749},{},[750],{"type":45,"value":751},"Controllers and minimal APIs are mutually exclusive program models; passing both is contradictory.",{"type":40,"tag":161,"props":753,"children":754},{},[755,760,765],{"type":40,"tag":188,"props":756,"children":757},{},[758],{"type":45,"value":759},"User set a value explicitly",{"type":40,"tag":188,"props":761,"children":762},{},[763],{"type":45,"value":764},"Leave it unchanged",{"type":40,"tag":188,"props":766,"children":767},{},[768],{"type":45,"value":769},"Smart defaults only fill gaps; explicit user intent always wins.",{"type":40,"tag":63,"props":771,"children":773},{"id":772},"validation",[774],{"type":45,"value":775},"Validation",{"type":40,"tag":70,"props":777,"children":780},{"className":778},[779],"contains-task-list",[781,794,810,819,828],{"type":40,"tag":74,"props":782,"children":785},{"className":783},[784],"task-list-item",[786,792],{"type":40,"tag":787,"props":788,"children":791},"input",{"disabled":789,"type":790},true,"checkbox",[],{"type":45,"value":793}," A \"Defaults applied\" log was produced with a Source (user\u002Frule) and rationale per row",{"type":40,"tag":74,"props":795,"children":797},{"className":796},[784],[798,801,803,808],{"type":40,"tag":787,"props":799,"children":800},{"disabled":789,"type":790},[],{"type":45,"value":802}," The exact single ",{"type":40,"tag":54,"props":804,"children":806},{"className":805},[],[807],{"type":45,"value":59},{"type":45,"value":809}," command line was emitted, listing only flags actually passed",{"type":40,"tag":74,"props":811,"children":813},{"className":812},[784],[814,817],{"type":40,"tag":787,"props":815,"children":816},{"disabled":789,"type":790},[],{"type":45,"value":818}," No parameter the user set explicitly was overridden",{"type":40,"tag":74,"props":820,"children":822},{"className":821},[784],[823,826],{"type":40,"tag":787,"props":824,"children":825},{"disabled":789,"type":790},[],{"type":45,"value":827}," Only unset parameters were filled",{"type":40,"tag":74,"props":829,"children":831},{"className":830},[784],[832,835,837,842],{"type":40,"tag":787,"props":833,"children":834},{"disabled":789,"type":790},[],{"type":45,"value":836}," Parameter names\u002Fchoices were confirmed against ",{"type":40,"tag":54,"props":838,"children":840},{"className":839},[],[841],{"type":45,"value":251},{"type":45,"value":843}," at creation (for advice-only requests, flagged as to-confirm rather than run eagerly)",{"type":40,"tag":63,"props":845,"children":847},{"id":846},"common-pitfalls",[848],{"type":45,"value":849},"Common Pitfalls",{"type":40,"tag":153,"props":851,"children":852},{},[853,869],{"type":40,"tag":157,"props":854,"children":855},{},[856],{"type":40,"tag":161,"props":857,"children":858},{},[859,864],{"type":40,"tag":165,"props":860,"children":861},{},[862],{"type":45,"value":863},"Pitfall",{"type":40,"tag":165,"props":865,"children":866},{},[867],{"type":45,"value":868},"Solution",{"type":40,"tag":181,"props":870,"children":871},{},[872,892,905,946],{"type":40,"tag":161,"props":873,"children":874},{},[875,880],{"type":40,"tag":188,"props":876,"children":877},{},[878],{"type":45,"value":879},"Treating heuristics as enforcement",{"type":40,"tag":188,"props":881,"children":882},{},[883,885,890],{"type":45,"value":884},"These are guidance rules, not validation. Always confirm against ",{"type":40,"tag":54,"props":886,"children":888},{"className":887},[],[889],{"type":45,"value":251},{"type":45,"value":891}," choices, since parameter names vary by template.",{"type":40,"tag":161,"props":893,"children":894},{},[895,900],{"type":40,"tag":188,"props":896,"children":897},{},[898],{"type":45,"value":899},"Overriding an explicit user value",{"type":40,"tag":188,"props":901,"children":902},{},[903],{"type":45,"value":904},"Apply a rule only when the target parameter is unset.",{"type":40,"tag":161,"props":906,"children":907},{},[908,913],{"type":40,"tag":188,"props":909,"children":910},{},[911],{"type":45,"value":912},"Assuming a flag name",{"type":40,"tag":188,"props":914,"children":915},{},[916,918,923,925,930,932,937,939,944],{"type":45,"value":917},"The exact flag differs per template — always verify with ",{"type":40,"tag":54,"props":919,"children":921},{"className":920},[],[922],{"type":45,"value":304},{"type":45,"value":924}," (e.g. ",{"type":40,"tag":54,"props":926,"children":928},{"className":927},[],[929],{"type":45,"value":436},{"type":45,"value":931}," is present only where ",{"type":40,"tag":54,"props":933,"children":935},{"className":934},[],[936],{"type":45,"value":304},{"type":45,"value":938}," lists it; controllers use ",{"type":40,"tag":54,"props":940,"children":942},{"className":941},[],[943],{"type":45,"value":739},{"type":45,"value":945},").",{"type":40,"tag":161,"props":947,"children":948},{},[949,954],{"type":40,"tag":188,"props":950,"children":951},{},[952],{"type":45,"value":953},"Picking a framework the template doesn't support",{"type":40,"tag":188,"props":955,"children":956},{},[957,959,964],{"type":45,"value":958},"Use the latest framework that appears in the template's ",{"type":40,"tag":54,"props":960,"children":962},{"className":961},[],[963],{"type":45,"value":411},{"type":45,"value":965}," choices, not an arbitrary newest version.",{"type":40,"tag":63,"props":967,"children":969},{"id":968},"more-info",[970],{"type":45,"value":971},"More Info",{"type":40,"tag":70,"props":973,"children":974},{},[975,988],{"type":40,"tag":74,"props":976,"children":977},{},[978,986],{"type":40,"tag":979,"props":980,"children":984},"a",{"href":981,"rel":982},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Ftools\u002Fdotnet-new",[983],"nofollow",[985],{"type":45,"value":59},{"type":45,"value":987}," — CLI reference",{"type":40,"tag":74,"props":989,"children":990},{},[991,998],{"type":40,"tag":979,"props":992,"children":995},{"href":993,"rel":994},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcore\u002Fdeploying\u002Fnative-aot\u002F",[983],[996],{"type":45,"value":997},"Native AOT deployment",{"type":45,"value":999}," — AOT framework requirements",{"items":1001,"total":1108},[1002,1019,1034,1052,1066,1086,1096],{"slug":1003,"name":1003,"fn":1004,"description":1005,"org":1006,"tags":1007,"stars":22,"repoUrl":23,"updatedAt":1018},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1008,1009,1012,1015],{"name":17,"slug":18,"type":15},{"name":1010,"slug":1011,"type":15},"Code Analysis","code-analysis",{"name":1013,"slug":1014,"type":15},"Debugging","debugging",{"name":1016,"slug":1017,"type":15},"Performance","performance","2026-07-12T08:23:25.400375",{"slug":1020,"name":1020,"fn":1021,"description":1022,"org":1023,"tags":1024,"stars":22,"repoUrl":23,"updatedAt":1033},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1025,1026,1029,1030],{"name":17,"slug":18,"type":15},{"name":1027,"slug":1028,"type":15},"Android","android",{"name":1013,"slug":1014,"type":15},{"name":1031,"slug":1032,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":1035,"name":1035,"fn":1036,"description":1037,"org":1038,"tags":1039,"stars":22,"repoUrl":23,"updatedAt":1051},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1040,1041,1042,1045,1048],{"name":17,"slug":18,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1043,"slug":1044,"type":15},"iOS","ios",{"name":1046,"slug":1047,"type":15},"macOS","macos",{"name":1049,"slug":1050,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1053,"name":1053,"fn":1054,"description":1055,"org":1056,"tags":1057,"stars":22,"repoUrl":23,"updatedAt":1065},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1058,1059,1062],{"name":1010,"slug":1011,"type":15},{"name":1060,"slug":1061,"type":15},"QA","qa",{"name":1063,"slug":1064,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":1067,"name":1067,"fn":1068,"description":1069,"org":1070,"tags":1071,"stars":22,"repoUrl":23,"updatedAt":1085},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1072,1073,1076,1079,1082],{"name":17,"slug":18,"type":15},{"name":1074,"slug":1075,"type":15},"Blazor","blazor",{"name":1077,"slug":1078,"type":15},"C#","csharp",{"name":1080,"slug":1081,"type":15},"UI Components","ui-components",{"name":1083,"slug":1084,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1087,"name":1087,"fn":1088,"description":1089,"org":1090,"tags":1091,"stars":22,"repoUrl":23,"updatedAt":1095},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1092,1093,1094],{"name":1010,"slug":1011,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1031,"slug":1032,"type":15},"2026-07-12T08:21:34.637923",{"slug":1097,"name":1097,"fn":1098,"description":1099,"org":1100,"tags":1101,"stars":22,"repoUrl":23,"updatedAt":1107},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1102,1103,1104],{"name":13,"slug":14,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1105,"slug":1106,"type":15},"Engineering","engineering","2026-07-19T05:38:19.340791",96,{"items":1110,"total":1215},[1111,1123,1130,1137,1145,1151,1159,1165,1171,1181,1194,1205],{"slug":1112,"name":1112,"fn":1113,"description":1114,"org":1115,"tags":1116,"stars":1120,"repoUrl":1121,"updatedAt":1122},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1117,1118,1119],{"name":17,"slug":18,"type":15},{"name":1105,"slug":1106,"type":15},{"name":1016,"slug":1017,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1003,"name":1003,"fn":1004,"description":1005,"org":1124,"tags":1125,"stars":22,"repoUrl":23,"updatedAt":1018},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1126,1127,1128,1129],{"name":17,"slug":18,"type":15},{"name":1010,"slug":1011,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1016,"slug":1017,"type":15},{"slug":1020,"name":1020,"fn":1021,"description":1022,"org":1131,"tags":1132,"stars":22,"repoUrl":23,"updatedAt":1033},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1133,1134,1135,1136],{"name":17,"slug":18,"type":15},{"name":1027,"slug":1028,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1031,"slug":1032,"type":15},{"slug":1035,"name":1035,"fn":1036,"description":1037,"org":1138,"tags":1139,"stars":22,"repoUrl":23,"updatedAt":1051},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1140,1141,1142,1143,1144],{"name":17,"slug":18,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1043,"slug":1044,"type":15},{"name":1046,"slug":1047,"type":15},{"name":1049,"slug":1050,"type":15},{"slug":1053,"name":1053,"fn":1054,"description":1055,"org":1146,"tags":1147,"stars":22,"repoUrl":23,"updatedAt":1065},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1148,1149,1150],{"name":1010,"slug":1011,"type":15},{"name":1060,"slug":1061,"type":15},{"name":1063,"slug":1064,"type":15},{"slug":1067,"name":1067,"fn":1068,"description":1069,"org":1152,"tags":1153,"stars":22,"repoUrl":23,"updatedAt":1085},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1154,1155,1156,1157,1158],{"name":17,"slug":18,"type":15},{"name":1074,"slug":1075,"type":15},{"name":1077,"slug":1078,"type":15},{"name":1080,"slug":1081,"type":15},{"name":1083,"slug":1084,"type":15},{"slug":1087,"name":1087,"fn":1088,"description":1089,"org":1160,"tags":1161,"stars":22,"repoUrl":23,"updatedAt":1095},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1162,1163,1164],{"name":1010,"slug":1011,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1031,"slug":1032,"type":15},{"slug":1097,"name":1097,"fn":1098,"description":1099,"org":1166,"tags":1167,"stars":22,"repoUrl":23,"updatedAt":1107},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1168,1169,1170],{"name":13,"slug":14,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1105,"slug":1106,"type":15},{"slug":1172,"name":1172,"fn":1173,"description":1174,"org":1175,"tags":1176,"stars":22,"repoUrl":23,"updatedAt":1180},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1177,1178,1179],{"name":17,"slug":18,"type":15},{"name":1105,"slug":1106,"type":15},{"name":1016,"slug":1017,"type":15},"2026-07-19T05:38:18.364937",{"slug":1182,"name":1182,"fn":1183,"description":1184,"org":1185,"tags":1186,"stars":22,"repoUrl":23,"updatedAt":1193},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1187,1188,1191,1192],{"name":1105,"slug":1106,"type":15},{"name":1189,"slug":1190,"type":15},"Monitoring","monitoring",{"name":1016,"slug":1017,"type":15},{"name":1063,"slug":1064,"type":15},"2026-07-12T08:21:35.865649",{"slug":1195,"name":1195,"fn":1196,"description":1197,"org":1198,"tags":1199,"stars":22,"repoUrl":23,"updatedAt":1204},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1200,1201,1202,1203],{"name":17,"slug":18,"type":15},{"name":1013,"slug":1014,"type":15},{"name":1105,"slug":1106,"type":15},{"name":1016,"slug":1017,"type":15},"2026-07-12T08:21:40.961722",{"slug":1206,"name":1206,"fn":1207,"description":1208,"org":1209,"tags":1210,"stars":22,"repoUrl":23,"updatedAt":1214},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1211,1212,1213],{"name":1013,"slug":1014,"type":15},{"name":1105,"slug":1106,"type":15},{"name":1060,"slug":1061,"type":15},"2026-07-19T05:38:14.336279",144]