Skip to content

Add AI-assisted single-word model name linter#4847

Draft
haiyuazhang wants to merge 4 commits into
Azure:mainfrom
haiyuazhang:haiyzhan/ai-single-word-model-name
Draft

Add AI-assisted single-word model name linter#4847
haiyuazhang wants to merge 4 commits into
Azure:mainfrom
haiyuazhang:haiyzhan/ai-single-word-model-name

Conversation

@haiyuazhang

Copy link
Copy Markdown
Member

Draft stacked on #4541.

Adds a TCGC single-word-model-name warning for C# SDK model names and an editor-only AI-assisted quick fix that expands into multiple @@clientName suggestions through the TypeSpec core resolveCodefixes API.

Depends on microsoft/typespec#11191 for dynamic codefix expansion.

Validation run locally:

  • pnpm --filter @azure-tools/typespec-client-generator-core build
  • pnpm --filter @azure-tools/typespec-client-generator-core exec vitest run test/rules/single-word-model-name.test.ts
  • pnpm --filter @azure-tools/typespec-azure-rulesets build
  • pnpm --filter @azure-tools/typespec-azure-rulesets test

@microsoft-github-policy-service microsoft-github-policy-service Bot added int:azure-specs Run integration tests against azure-rest-api-specs eng lib:azure-core Issues for @azure-tools/typespec-azure-core library lib:azure-resource-manager Issues for @azure-tools/typespec-azure-core library emitter:autorest Issues for @azure-tools/typespec-autorest emitter emitter:python Issues for @azure-tools/typespec-python emitter emitter:typescript Issues for @azure-tools/typespec-ts emitter lib:tcgc Issues for @azure-tools/typespec-client-generator-core library lib:azure-http-specs For issues/prs related to the @azure-tools/typespec-azure-http-specs package meta:website TypeSpec.io updates linter Issues related to linter rules labels Jul 7, 2026
Add a TCGC C# model naming rule with editor-only dynamic quick fixes powered by resolveCodefixes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@haiyuazhang haiyuazhang changed the base branch from haiyzhan/linter-url-to-uri to main July 7, 2026 19:53
@haiyuazhang haiyuazhang force-pushed the haiyzhan/ai-single-word-model-name branch from 103879e to 75dc4cc Compare July 7, 2026 19:53
@azure-sdk-automation

azure-sdk-automation Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

All changed packages have been documented.

  • @azure-tools/typespec-azure-rulesets
  • @azure-tools/typespec-client-generator-core
Show changes

@azure-tools/typespec-client-generator-core - feature ✏️

Add csharp-no-single-word-model-name linter rule for C# SDK model naming, with optional AI-powered quick fix suggestions in editors.

@azure-tools/typespec-azure-rulesets - feature ✏️

Add csharp-no-single-word-model-name linter rule for C# SDK model naming, with optional AI-powered quick fix suggestions in editors.

@pkg-pr-new

pkg-pr-new Bot commented Jul 7, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@azure-tools/typespec-azure-rulesets@4847
npm i https://pkg.pr.new/@azure-tools/typespec-client-generator-core@4847

commit: d6f0a49

@azure-sdk-automation

Copy link
Copy Markdown
Contributor

You can try these changes here

🛝 Playground 🌐 Website

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

⚡ Benchmark Results

⚠️ 15 metric(s) regressed above the +5% threshold:

Metric Baseline Current Change
total 🔴 1.01s 🔴 1.08s +6.9% 🔴
loader 🟡 305.5ms 🟡 330.0ms +8.0% 🔴
resolver 🟢 40.2ms 🟢 42.5ms +5.6% 🔴
checker 🟡 364.8ms 🟡 391.4ms +7.3% 🔴
linter 🟡 215.1ms 🟡 228.4ms +6.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🔴 26.6ms 🔴 28.3ms +6.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🔴 27.8ms 🔴 30.2ms +8.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 33.2ms 🔴 34.9ms +5.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 32.7ms 🔴 34.7ms +6.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 19.6ms 🔴 21.3ms +8.8% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🔴 29.8ms 🔴 32.3ms +8.4% 🔴
emit 🔴 6.05s 🔴 6.37s +5.2% 🔴
 ↳ emit/@azure-tools/typespec-autorest 🟢 125.3ms 🟢 132.9ms +6.1% 🔴
 ↳ emit/@azure-tools/typespec-python 🔴 2.26s 🔴 2.37s +5.2% 🔴
 ↳ emit/@typespec/http-client-js 🔴 571.1ms 🔴 600.2ms +5.1% 🔴
Full details – comparing f906726 vs baseline rolling-baseline-79a95b7-5ddeb8e (rolling baseline (20 main runs))
Metric Baseline Current Change
total 🔴 1.01s 🔴 1.08s +6.9% 🔴
loader 🟡 305.5ms 🟡 330.0ms +8.0% 🔴
resolver 🟢 40.2ms 🟢 42.5ms +5.6% 🔴
checker 🟡 364.8ms 🟡 391.4ms +7.3% 🔴
validation 🟢 85.4ms 🟢 88.8ms +4.0%
 ↳ validation/@azure-tools/typespec-azure-core 🟡 12.6ms 🟡 13.4ms +6.4%
 ↳ validation/@typespec/http 🟡 15.5ms 🟡 16.5ms +6.2%
 ↳ validation/@typespec/rest 🟢 1.6ms 🟢 1.8ms +8.2%
 ↳ validation/@typespec/versioning 🔴 51.6ms 🔴 52.9ms +2.5%
 ↳ validation/compiler 🟢 3.9ms 🟢 4.1ms +5.0%
linter 🟡 215.1ms 🟡 228.4ms +6.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/auth-required 🟢 0.1ms 🟢 0.1ms +9.1%
 ↳ linter/@azure-tools/typespec-azure-core/bad-record-type 🟢 0.6ms 🟢 0.6ms +1.6%
 ↳ linter/@azure-tools/typespec-azure-core/byos 🟢 8.3ms 🟢 8.8ms +6.1%
 ↳ linter/@azure-tools/typespec-azure-core/casing-style 🟢 1.4ms 🟢 1.5ms +5.6%
 ↳ linter/@azure-tools/typespec-azure-core/composition-over-inheritance 🟢 0.2ms 🟢 0.2ms +6.6%
 ↳ linter/@azure-tools/typespec-azure-core/documentation-required 🟢 2.0ms 🟢 2.1ms +5.4%
 ↳ linter/@azure-tools/typespec-azure-core/friendly-name 🟢 1.4ms 🟢 1.5ms +5.5%
 ↳ linter/@azure-tools/typespec-azure-core/key-visibility-required 🟢 0.4ms 🟢 0.4ms +5.6%
 ↳ linter/@azure-tools/typespec-azure-core/known-encoding 🟢 0.5ms 🟢 0.5ms +7.0%
 ↳ linter/@azure-tools/typespec-azure-core/long-running-polling-operation-required 🟢 0.8ms 🟢 0.9ms +5.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-case-mismatch 🟢 0.7ms 🟢 0.7ms +5.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-closed-literal-union 🟢 1.0ms 🟢 1.1ms +7.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-enum 🟢 0.2ms 🟢 0.3ms +4.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-error-status-codes 🟢 0.3ms 🟢 0.3ms +4.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-explicit-routes-resource-ops 🟢 0.2ms 🟢 0.2ms +9.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-format 🟢 0.8ms 🟢 0.9ms +4.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-generic-numeric 🟢 0.8ms 🟢 0.9ms +4.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🔴 26.6ms 🔴 28.3ms +6.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-legacy-usage 🟢 2.0ms 🟢 2.1ms +4.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-multiple-discriminator 🟢 0.2ms 🟢 0.3ms +11.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-nullable 🟢 0.4ms 🟢 0.4ms +5.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-offsetdatetime 🟢 2.0ms 🟢 2.1ms +5.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-openapi 🟢 2.3ms 🟢 2.4ms +2.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-private-usage 🟢 3.2ms 🟢 3.4ms +8.1%
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🔴 27.8ms 🔴 30.2ms +8.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 33.2ms 🔴 34.9ms +5.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rest-library-interfaces 🟢 0.1ms 🟢 0.1ms +16.6%
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 7.6ms 🟢 8.3ms +8.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-rpc-path-params 🟢 0.4ms 🟢 0.4ms +6.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-string-discriminator 🟢 0.1ms 🟢 0.2ms +8.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-unknown 🟢 0.3ms 🟢 0.4ms +6.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-unnamed-union 🟢 0.8ms 🟢 0.8ms +5.6%
 ↳ linter/@azure-tools/typespec-azure-core/operation-missing-api-version 🟢 0.4ms 🟢 0.4ms +5.0%
 ↳ linter/@azure-tools/typespec-azure-core/request-body-problem 🟢 0.5ms 🟢 0.5ms +4.7%
 ↳ linter/@azure-tools/typespec-azure-core/require-versioned 🟢 0.1ms 🟢 0.1ms +5.2%
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 32.7ms 🔴 34.7ms +6.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/rpc-operation-request-body 🟢 0.7ms 🟢 0.8ms +9.0%
 ↳ linter/@azure-tools/typespec-azure-core/spread-discriminated-model 🟢 0.5ms 🟢 0.5ms +6.0%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 7.6ms 🟢 8.1ms +7.1%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-operations 🟢 0.3ms 🟢 0.3ms +2.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-child-resources 🔴 22.1ms 🔴 21.7ms -1.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-lifecycle-operations 🟢 0.3ms 🟢 0.3ms +0.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-common-types-version 🟡 12.2ms 🟡 12.9ms +5.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-no-key 🟢 0.2ms 🟢 0.2ms +12.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-usage-discourage 🟢 0.1ms 🟢 0.1ms +6.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-delete-operation-response-codes 🟢 5.1ms 🟢 4.6ms -9.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-path-casing-conflicts 🟡 17.2ms 🟡 17.7ms +2.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-record 🟢 0.6ms 🟢 0.7ms +7.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-post-operation-response-codes 🟢 1.4ms 🟢 1.4ms +2.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-put-operation-response-codes 🟢 0.2ms 🟢 0.2ms -4.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-action-no-segment 🟢 0.4ms 🟢 0.5ms +10.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-duplicate-property 🟢 0.4ms 🟢 0.4ms +10.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator 🟢 0.1ms 🟢 0.1ms +8.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb 🟢 0.2ms 🟢 0.2ms +12.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property 🟢 0.3ms 🟢 0.3ms +12.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format 🟢 0.2ms 🟢 0.2ms +2.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars 🟢 0.5ms 🟢 0.5ms +10.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-name-pattern 🟢 0.1ms 🟢 0.1ms +1.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation 🟢 0.5ms 🟢 0.6ms +9.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 8.9ms 🟢 9.7ms +9.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-patch 🟢 0.8ms 🟢 0.9ms +7.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars 🟢 0.4ms 🟢 0.4ms +4.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state 🟢 0.4ms 🟢 0.5ms +7.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/beyond-nesting-levels 🟢 0.2ms 🟢 0.3ms +9.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/empty-updateable-properties 🟢 0.4ms 🟢 0.4ms +8.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation 🟢 0.1ms 🟢 0.1ms +0.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 19.6ms 🔴 21.3ms +8.8% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint 🟢 0.1ms 🟢 0.2ms +10.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-x-ms-identifiers 🟢 1.0ms 🟢 1.0ms +5.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-empty-model 🟢 0.3ms 🟢 0.3ms +15.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-override-props 🟢 0.3ms 🟢 0.3ms +10.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-resource-delete-operation 🟢 0.5ms 🟢 0.5ms +15.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🔴 29.8ms 🔴 32.3ms +8.4% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/patch-envelope 🟢 0.4ms 🟢 0.4ms +7.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/resource-name 🟢 0.4ms 🟢 0.5ms +4.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/secret-prop 🟢 5.5ms 🟢 5.5ms +0.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/unsupported-type 🟢 0.7ms 🟢 0.7ms +7.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/version-progression 🟢 0.3ms 🟢 0.3ms +1.9%
 ↳ linter/@azure-tools/typespec-client-generator-core/property-name-conflict 🟢 2.3ms 🟢 2.4ms +5.4%
 ↳ linter/@azure-tools/typespec-client-generator-core/require-client-suffix 🟢 1.7ms 🟢 1.7ms +3.8%
emit 🔴 6.05s 🔴 6.37s +5.2% 🔴
 ↳ emit/@Azure-Tools 🟢 0.0ms 🟢 0.0ms +0.0%
 ↳ emit/@azure-tools/typespec-autorest 🟢 125.3ms 🟢 132.9ms +6.1% 🔴
 ↳ emit/@azure-tools/typespec-python 🔴 2.26s 🔴 2.37s +5.2% 🔴
 ↳ emit/@typespec 🟢 0.0ms 🟢 0.0ms +0.0%
 ↳ emit/@typespec/http-client-js 🔴 571.1ms 🔴 600.2ms +5.1% 🔴
 ↳ emit/@typespec/openapi3 🟢 107.8ms 🟢 113.1ms +4.9%
 ↳ emit/@typespec/openapi3/compute 🟢 93.6ms 🟢 98.2ms +4.9%
 ↳ emit/@typespec/openapi3/write 🟢 13.9ms 🟢 14.6ms +5.0%

Averaged across 3 specs (azure-arm-resource-manager, azure-core-dataplane, azure-full).
Threshold: changes > ±5% are highlighted.
🟢 Fast · 🟡 Moderate (stages >200ms, rules >10ms) · 🔴 Slow (stages >400ms, rules >20ms)

Haiyuan Zhang and others added 3 commits July 8, 2026 04:08
Point the submodule at the latest TypeSpec draft PR commit.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the C#-scoped no-single-word-model-name rule ID across code, tests, docs, and rulesets.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Point the submodule at the latest TypeSpec draft PR commit.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:autorest Issues for @azure-tools/typespec-autorest emitter emitter:python Issues for @azure-tools/typespec-python emitter emitter:typescript Issues for @azure-tools/typespec-ts emitter eng int:azure-specs Run integration tests against azure-rest-api-specs lib:azure-core Issues for @azure-tools/typespec-azure-core library lib:azure-http-specs For issues/prs related to the @azure-tools/typespec-azure-http-specs package lib:azure-resource-manager Issues for @azure-tools/typespec-azure-core library lib:tcgc Issues for @azure-tools/typespec-client-generator-core library linter Issues related to linter rules meta:website TypeSpec.io updates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant