Repository navigation
[Swagger Linter Migration] LroExtension + XMSLongRunningOperationProperty -> lro-missing-polling-metadata - #5652
Yuchao Yan (msyyc) wants to merge 13 commits into
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 625c0cd9-bacc-4f9c-8b96-4ded1932a30a
|
All changed packages have been documented.
Show changes
|
📦 Package size report✅ No notable package size changes compared to the base branch. 14 package(s) with no notable change
Packed = gzipped |
commit: |
There was a problem hiding this comment.
🟡 Changes recommended
Metadata resolution occurs before deduplication and can emit duplicate diagnostics for operations reached through overlapping service traversals.
1 open finding
What changed in this PR
Adds an opt-in ARM linter rule that detects PATCH and provider/collection POST operations returning 202 without native polling metadata.
Changes:
- Implements and registers the new rule.
- Adds comprehensive tests and user documentation.
- Registers the rule as disabled by default with Chronus entries.
| File | Description |
|---|---|
lro-missing-polling-metadata.ts |
Implements metadata validation. |
lro-missing-polling-metadata.test.ts |
Tests supported and excluded cases. |
lro-missing-polling-metadata.md |
Documents usage and remediation. |
src/linter.ts |
Registers the rule. |
resource-manager.ts |
Disables the rule by default. |
README.md |
Lists the rule. |
reference/linter.md |
Updates generated reference documentation. |
arm-rules.md |
Adds the migration mapping. |
lro-missing-polling-metadata-arm.md |
Describes the ARM feature change. |
lro-missing-polling-metadata-rulesets.md |
Describes ruleset registration. |
🧠 Review effort: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
You can try these changes here
|
Mirror the reviewed LroExtension source repair and consolidate the registered regression while preserving fresh per-test setup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 625c0cd9-bacc-4f9c-8b96-4ded1932a30a
## Original Swagger linter linter code: [LroExtension](https://github.com/Azure/azure-openapi-validator/blob/main/packages/rulesets/src/spectral/az-common.ts) linter doc: [lro-extension.md](https://github.com/Azure/azure-openapi-validator/blob/main/docs/lro-extension.md) - [x] Inspect OAS2 PUT, PATCH, POST and DELETE operations with an explicit `202` response. - [x] Require a truthy `x-ms-long-running-operation` on the selected operation; an absent or false extension violates the original check. - [x] Exempt GET and operations without an explicit `202` response. The Spectral selector `$.paths[*][put,patch,post,delete].responses[?(@Property == '202')]^^` walks from each selected response back to its operation, where the extension is checked. The diagnostic concerns the operation's extension/missing extension, not whether its `Location` header actually describes polling. Copying that extension-based behavior would miss native semantic failures and duplicate existing ARM prerequisites. ## Migrated native TypeSpec behavior Mapping: **LroExtension → `lro-extension`** (`tsp-lintdiff-local-linter/lro-extension`). Coverage is deliberately **partial**, limited to supported uncovered ARM semantics. The maintained resource-manager ruleset already owns registered resource-instance POST/PUT/DELETE response-code checks. This migration does not duplicate them. It checks PATCH and ARM-marked collection/provider POST operations with exact HTTP `202` responses, using compiler `listServices`, HTTP `getHttpService`, ARM `isArmCollectionAction`, and Azure Core `getLroMetadata`. Supported customized `ArmCustomPatchAsync` and `ArmProviderActionAsync` headers can retain a plain `Location` header while losing native polling metadata; those operations receive one warning on the authored operation. Semantic LRO headers/default async templates are compliant. Supported synchronous template response customizations are also covered. The temporary mixed ARM/data-plane lintdiff runner uses service-root `getArmProviderNamespace` only for isolation. The documented promotion adaptation removes that guard when the official ARM ruleset supplies the audience boundary. Production logic uses compiler/HTTP/Core/ARM only: no emitter, OpenAPI extensions, TCGC, reference-string inference, or unsafe version mutation. Polling metadata, not emitted extension overrides or historical Swagger snapshots, defines the native contract. Version attribution is assessed separately against corpus-selected API versions; this is not an all-historical-version or universal Swagger-equivalence claim. The earlier nested-service warning regression retains one target warning for an overlapping missing-metadata operation and two for distinct operations sharing response types. The cycle-1 repair additionally marks each eligible semantic Operation visited **before** impure metadata resolution, including compliant operations. A real registered-package regression uses nested services that are both ARM-provider marked, a standard async provider action, and original-uri final state with no GET at that route. It now produces **exactly one Azure Core `no-operation-at-original-uri` diagnostic, zero `lro-extension` diagnostics, and no other diagnostics**, rather than resolving metadata twice. Eligibility, service isolation, warning severity/message, and authored Operation targets are unchanged. ## Migration evidence and validation [Migration note: latest results, complete project accounting, supported-shape evidence, version attribution and limitations](https://github.com/Azure/typespec-azure/blob/9afb5818fba089835296258049ad7104e8a92c50/packages/typespec-lintdiff/test/fixtures/LroExtension/migration.md). - Scoped four-file formatting/check, package build and changed-TypeScript lint passed before the new commit. - Focused native tests: **17 passed** (the original 16 plus the actual registered-linter regression). The original overlap-warning1 and distinct-operation-warning2 controls remain covered. - All four affected fixture groups passed with unchanged snapshot/expectation enforcement: **51 cases**. Explicitly reviewed ambient expectations, intentional Swagger/native discrepancies, and the existing mapped-compliance advisory are preserved; this is not a claim of 51 universally equivalent or universally clean cases. - Required fresh full ARM corpus: **468 attempted, 462 compiled successfully**, with **six unchanged compile failures** (DeviceProvisioningServices, TenantActionGroups, Network/Network, Quota, Resources/deployments and ServiceLinker; duplicate-body/missing-uri-param). Their details and impact are disclosed in the migration note. - Retained Swagger results: **39 diagnostics / 14 projects**; native results: **14 diagnostics / 5 projects**. Five projects overlap; nine are validator-only; none are TypeSpec-only. The 25 intentional exclusions are POST14, PUT6 and DELETE5, belonging to documented prerequisites/out-of-contract operations rather than unexplained supported-native misses. - The fresh representative/full corpus after the cycle-1 production repair preserved all 14 native diagnostic identities and all six known compilation failures. - Validation retained the prepared source profile: Core `a6137cac43a727ce0c2656364fd72d50c272ee4a`, integrated base `adf0d2865887d9e12609d7a4d398b96211510a85`, and checked-in runner settings. The fetched migration base had advanced to `b4fdf202afdda010789557603b571f046f0ca70c`; the branch/Core/profile were not moved or replayed. - The historical complete **596-case fixture baseline** had **72 snapshot mismatches and three expectation mismatches** previously established as noncausal. It was not rerun this cycle and is not represented as a fully green suite. - A fresh persistent independent local reviewer found no significant issues in the complete **57-file** task diff, including the registered regression, after an actual same-reviewer follow-up. The new incremental commit changes exactly four approved files. - Generated corpus output was archived and restored through the exact-digest reviewed cleanup plan (971 generated changes); no generated coverage, logs, dependency manifests, Core gitlink changes or skill changes are committed. Published source head: [`9afb5818fba089835296258049ad7104e8a92c50`](9afb581), parent `f0973f43bffa73169fdde0436566c2534bdab595`, on the existing development branch. This remains the development-stage draft. A **new current-head GitHub review is pending**; the earlier `f097` review does not cover this commit. [Official promotion draft #5652](#5652) remains unchanged at `d2d665bb160a96c384daee82d91b264f98368087` with its previous `f097` source pin, pending a clean new source review and an explicitly authorized incremental refresh. Neither PR is merged by this workflow. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 625c0cd9-bacc-4f9c-8b96-4ded1932a30a
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Retain literal rule fixtures and package-isolation regressions. Published examples were independently executed and recorded as one-time session evidence; no continuous Markdown coverage is claimed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Combine LroExtension and XMSLongRunningOperationProperty in one rule with operation-level diagnostics, shared resolver deduplication, and canonical acceptance coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Preserve the combined LRO migration mapping alongside the new resource-missing-read and use-resource-path-for-put mappings from main. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the native operation listener within explicit services, preserve concrete endpoint eligibility and resolver side effects, and consolidate duplicate shared-header coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use observable native async positives and matched plain-header negatives without HTTP metadata assertions. Retain the registered resolver-side-effect regression. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Copilot resolve the merge conflicts in this pull request |
…extension # Conflicts: # website/src/content/docs/docs/howtos/ARM/arm-rules.md Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Resolved the |

Observable acceptance follow-up (October 21, 2026)
Published in 09b7f5127. This follow-up implements ID28's callback cleanup and retains the evidence-backed ID27 interaction regression. It supersedes the earlier skipped-ID27/28 and callback-inspection statements; historical results below remain historical.
toBeValid()without HTTP response/header inspection. Matching publicLroHeaders = PlainLocationHeadersPATCH/DELETE customizations warn at the authored operation; existing independent verb/status/header and cardinality cases remain.createOrUpdate,updateandremove. The mutation was restored byte-for-byte; no production code change is published.no-operation-at-original-uridiagnostics instead of one. The restored registered case passes.pnpm format, rootpnpm lint, and diff hygiene passed. Production source and built entry were restored before final validation. This is not a claim that the broader test TypeScript project or CI is green.Summary
Consolidate LroExtension and XMSLongRunningOperationProperty into the single public ARM rule
@azure-tools/typespec-azure-resource-manager/lro-missing-polling-metadata. This PR absorbs the official-destination policy and unique regression coverage from #5709 rather than adding a second rule with the same name.Published in 3ca178be4, following the combined-migration presentation in #5556, #5294 and #5423 and the review request on #5709.
Please continue review of both migrated policies here. #5709 is marked superseded by this combined proposal but remains open, with its branch and review history retained. This consolidation does not resolve existing review threads, claim reviewer agreement, or establish fresh CI approval.
Combined behavior and legacy-rule mapping
202response, even without a polling header. This remains partial native coverage of the broader Swagger selector.200,201,202or204response contains a case-insensitiveLocationorAzure-AsyncOperationheader.The triggers are related but not interchangeable. A headerless PATCH
202exercises only the first; PUT201with Location exercises only the second; a marked provider POST202with Location exercises both.operationlistener resolves HTTP metadata per concrete endpoint within an explicit service namespace (including nested namespaces), without a per-service walk, visited-operation bookkeeping, or no-service global fallback. Either trigger selects the operation for onegetLroMetadatacall. The registered overlapping-service regression retains exactly one Core resolver-side-effect diagnostic and zero ARM warnings. Matching both triggers or several headers/statuses does not duplicate the ARM warning. Different operations sharing response properties remain independent.x-ms-long-running-operation: truedoes not. GET/polling GET and HEAD remain excluded; Operation-Location and Retry-After do not trigger the ARM header policy. The existing explicit-numeric-status behavior is retained; broader ranges do not qualify.lro-location-headerstill own their status-set/header-presence policies; Core's Operation-Location polling-link rule is not replaced. Registered-resource POST/PUT/DELETE operations can now additionally receive this rule's header-triggered warning, as already proposed by [Swagger Linter Migration][Superseded by #5652] XMSLongRunningOperationProperty -> lro-missing-polling-metadata #5709.falseentry in the central Azure resource-manager ruleset. The ARM library's compiler-generatedallincludes registered rules, including this one. Selecting the combined rule selects both triggers; it is not universally disabled merely because the central entry isfalse.Consolidation and immutable provenance
9afb581801cc24932f7e1d5cc5e07710The immutable development implementations, fixtures and migration evidence are unchanged. This is an authorized consolidation of their official destinations, not a repair of either source. The #5709 branch was not merged wholesale or rewritten; its unique behavior is integrated into #5652's existing implementation and canonical suite. No claim is made that #5709's commit history is now an ancestor of this branch.
Historical corpus counts belong to their respective source revisions. They do not establish current combined-rule parity, all-version coverage, or a new corpus run.
Canonical fixture coverage after consolidation
All rule behavior lives in
test/rules/lro-missing-polling-metadata.test.ts; no parallel legacy-rule or interaction suite is added.202responses without metadata201Azure-AsyncOperation, PATCH200mixed-case Location, unmarked POST202Location, DELETE204lowercase Azure-AsyncOperation203/400, Operation-Location/Retry-After and headerless nonmatching operations@OpenAPI.extensionoverride still warns; qualifying header after an unrelated header still warnsPackage-level public-entry coverage continues to guard against loading AutoRest or TCGC. The existing ARM feature changeset now describes the combined shipped policy; the separate rulesets internal entry is retained without redundant new notes. Authored docs, generated README/reference, the generated ignored rule page and the manual ARM matrix describe both legacy mappings.
Current validation for selected review fixes (IDs 29–31)
Published in 2a67f1531. The statements below supersede traversal and example details in the historical sections.
pnpm format, and rootpnpm lint: passed. Unrelated Astro-only formatter changes were excluded.cf8712b9, matching the clean core checkout; compiler and HTTP imports resolve within this worktree. Older validation pins below are historical, not the current dependency claim.PlainLocationHeadersversus semanticArmLroLocationHeader<FinalResult = Widget>onArmCustomPatchAsync; Widget and surrounding service setup are assumed, not moved into a shared preamble.Microsoft.Contoso.updateversus zero diagnostics, retaining numeric202in both. The document/snippet hashes and exact setup/targets are recorded outside the repository. This is one-time execution, not continuous Markdown coverage.Historical validation for the consolidation (before selected review fixes)
35canonical rule cases,1package-isolation case and7ruleset cases).pnpm formatfollowed bypnpm lint: passed. Six unrelated Astro-only formatter changes were excluded from the final diff.Widgets.updateversus zero diagnostics. Both retain an explicit202; document/snippet hashes and target receipts are recorded outside the repository. This is one-time evidence, not continuous Markdown coverage; no bespoke parser is added to the test suite.The historical consolidation validation recorded core
054fdc2a; current selected-fix validation uses the pin stated above. The full monorepo build, website build and migration corpus were not rerun. New GitHub checks and maintainer review of this combined head remain separate gates; the pre-consolidation Windows benchmark timeout is not represented as resolved by this change.Historical #5652 promotion notes before consolidation (superseded where the combined contract above differs)
Original Swagger linter
linter code: LroExtension
linter doc: lro-extension.md
202response keys ($.paths[*][put,patch,post,delete].responses[?(@property == '202')]^^).x-ms-long-running-operationvalue on the selected operation. The published message calls fortrue; the check is truthiness rather than strict Boolean equality.202response.Spectral traverses response keys back to their enclosing operation and reports the offending operation path and generated-document range. This emitted-field check does not establish native polling semantics. Existing registered-resource POST/PUT/DELETE prerequisites and comparison-only extension overrides are not evidence that a new native rule should duplicate those policies.
Source TypeSpec lintdiff rule
LroExtension source rule: validator ID
LroExtension, canonical validator sluglro-extension, local ruletsp-lintdiff-local-linter/lro-extension.Canonical repository:
Azure/typespec-azure; branchfeature/lintdiff-lro-extension; pinned clean reviewed commit9afb5818fba089835296258049ad7104e8a92c50; source checkoutC:\dev\worktrees\lintdiff-lro-extension; development draft #5639. No uncommitted source changes. The named source is assumed done for this run, not claimed to have a separate explicit user done-status confirmation, and remains immutable during promotion.This incremental refresh follows authorized source repair from
f0973f43bffa73169fdde0436566c2534bdab595to9afb5818fba089835296258049ad7104e8a92c50, independently reviewed clean in one new Balanced round (review5467572888/request32858013747). It preserves the valid ARM destination adaptations rather than merging the development branch. The reviewed four-file incremental refresh was committed and pushed to the existing canonical promotion branch as98519f936a2838b5c95620ce4f449c08d20578a5, with parentd2d665bb160a96c384daee82d91b264f98368087; the complete promotion PR still contains ten task files and now records source pin9afb5818fba089835296258049ad7104e8a92c50.Destination analysis and naming
The agent-selected destination is
@azure-tools/typespec-azure-resource-manager, with concise official namelro-missing-polling-metadata. Catalog applicability Both makes Azure Core a plausible alternative, but the supported native contract depends on ARMisArmCollectionActionto recognize provider/collection POST. Moving that dependency into Core would invert the dependency direction. Existing Core polling-link and ARM header/status-code rules do not establish this missing-metadata condition on the supported custom operations; registered resource-instance POST/PUT/DELETE ownership stays separate.This is partial supported native coverage, not universal equivalence with the Swagger selector. Availability is opt-in: the resource-manager ruleset registers the new full name with plain
false, and the destination feature and rulesets internal disabled-registration changes are separate Chronus entries.Promoted native behavior and deliberate adaptation
The rule uses compiler
listServices, HTTPgetHttpService, exact numeric202response metadata, ARMisArmCollectionAction, and Azure CoregetLroMetadata. PATCH or marked provider/collection POST lacking native LRO metadata receives one warning on the authored operation. Other verbs, unmarked POST, resource-instance POST, absent202, and present polling metadata do not receive this warning. It examines compiler-program operations rather than emitted version snapshots; corpus version attribution remains separate evidence.The source semantic-operation
Setis preserved and now marks each eligible operation before calling the impure metadata resolver, including compliant operations. Overlapping parent/child HTTP-service traversal reports one warning on the same missing-metadata action, while two operations sharing response headers still produce two authored targets. For a compliant original-uri action without its original-route GET, actual registered linter execution produces exactly one Core diagnostic and zero target warnings, not two Core diagnostics. There is no emitter, OpenAPI-extension/reference-string inference, or TCGC runtime dependency.The source provider-service guard is mixed ARM/data-plane lintdiff audience isolation, not a metadata prerequisite. The native copy deliberately removes it, following operation-oriented ARM LRO siblings (
lro-location-headerandretry-after) and the selected official ARM audience. A meaningful providerless PATCH regression asserts exactly one warning with the preserved code/message and authored operation start/end; this is not a source-semantic repair.Fixture-to-native test mapping
The ten original fixtures map to the exact native titles below. JSON snapshots/extension overrides were not copied, and no snapshot-parity claim is made.
it("reports a synchronous custom PATCH returning 202 without polling metadata")it("reports the documented async PATCH customization without polling metadata")it("accepts the documented async PATCH with semantic LRO headers")it("reports a synchronous provider POST returning 202 without polling metadata")it("reports an async provider POST with plain Location headers")it("accepts default async provider polling metadata")it("accepts standard async resource PATCH polling metadata")it("leaves registered resource-instance POST response-code ownership to the existing rule")it("leaves registered resource-instance POST response-code ownership to the existing rule")it("leaves registered resource-instance POST response-code ownership to the existing rule")it("reports a nested service operation once across overlapping HTTP service traversals")it("reports each distinct provider operation once when response headers are shared")it("checks PATCH without provider metadata when the ARM rule is selected")it("resolves a compliant operation once before reporting Core diagnostics across overlapping services")The remaining source predicate controls are preserved in the 19-case native suite: synchronous no-202/semantic accepted responses, default async custom/resource/provider templates, excluded verbs, and unmarked POST. The separate namespace-only source case is folded into the meaningful nested dedup regression; no duplicate framework-only namespace traversal test was added. Registered resource-instance POST native exclusion is preserved for the three comparison-only extension fixtures; extension overrides themselves are not native semantics.
All19 logical cases now reside in
test/rules/lro-missing-polling-metadata.test.ts. The registered regression deliberately moved from an unpublished standalone file; its logical title/program/assertions are unchanged, but its physical test ID path changed. A fresh raw Tester instance is awaited in the existing beforeEach for every case, and the original18 cases retain their direct rule tester and exact assertions. The new case uses the raw instance'sdiagnosewith the actual registered linter enabled. This removes duplicate initialization in separate files while retaining the repository factory's memoized frozen base filesystem; no mutable instance reuse, module-scope prewarming, assertion suppression, timeout, concurrency or cache changes were introduced. Duplicate initialization is verified, not a proven cause of the historical timeouts.Migration evidence
Source migration.md contains the focused predicates, retained raw validator witnesses, project explanations, version selection, and corpus declaration. The retained source run attempted 468 ARM projects, compiled 462, and had six unchanged compile failures. Swagger produced 39 findings across 14 projects versus native 14 across 5 projects; 25 intentionally excluded POST/PUT/DELETE findings do not establish universal parity. Missing retained generated-body evidence remains explicitly disclosed in migration.md.
The six unchanged failures are DeviceProvisioningServices, TenantActionGroups, Network/Network, Quota, Resources/deployments, and ServiceLinker. Source17 and strict51 passed; the separate complete596 fixture report retains72 snapshot and3 expectation mismatches proven noncausal and is not claimed green. No source corpus was rerun during promotion.
Validation
regen-docscompleted naturally.--ignore-path NULwrite/check passed with each filename processed;.prettierignore/.gitignoreunchanged. Ignored generated page is review evidence, not force-staged.ArmCustomPatchAsyncaccepted response uses namedLroHeaderscustomization: plain Location produces exactly one target-enabled warning at authoredupdate; semanticArmLroLocationHeader<FinalResult = Widget>plus RetryAfter produces zero, not an exemption. Both compile without unrelated diagnostics.Validation limitations and review state
Validation uses the explicitly dispatched prepared
d823d2456182f21fed3a70511edecf14943a3209base/coreb08e0a716343d835197ac49d3e7b0a636cf6a3cdprofile. Fetched canonical main advanced tof4d313479a5d3edf12374845500cf943eb1fa534with newer core/lock/workspace inputs; they were not integrated, and no claim of validation on the newer profile is made. No supplemental repository-wide wrapper or website build was warranted; CI remains authoritative for the Website job.The historical17/18 providerless marker failure and its authorized correction remain preserved. Cycle1's original standalone registered beforeEach and the separately authorized unchanged retry each timed out at10000ms (18/19); their assertions were not reached. The original instrumented diagnostic passed19/19 with6268.688ms setup, and a separately approved buffered diagnostic passed19/19 with4126.463ms setup. Both probes were restored byte-exactly. Neither diagnostic proves the original timeout cause, and no timeout increase was justified or applied.
The broader authorized recovery consolidated the registered case into the existing suite without changing logical coverage or deadlines. The corrected required selection and all remaining native gates now pass. Native correction1 covers this coherent grouping change; correction2 covers a review-packet .NET relative-path invocation error, repaired with explicit absolute artifact paths and continuation at the next unfinished packet step without replaying passing validation or canonical API queries. Prior failures, exhausted recovery allowances and the unrelated historical full596 limitation remain disclosed.
Fresh outer-owned persistent independent local review is complete: reviewer
13f22e35-64e8-4d7d-901f-ff3582839997returned CLEAN LOCAL, with actual same-reviewer follow-up acknowledged and the complete ten-file promotion scope, four-file incremental refresh, source pin, 19-case preservation and all 15 validation records inspected. Exact-content publication was approved. This local review is not GitHub approval of the refreshed head.The first post-push PR read still reported the prior native head despite a successful push and the canonical remote reporting the new commit. That original observation is preserved; subsequent fresh read-only canonical PR, remote and local evidence positively reconciled the actual head to
98519f936a2838b5c95620ce4f449c08d20578a5. Its cause remains unproven, and there was no second push or publication retry.At publication, fresh promotion GitHub review and backlog drain remained pending, and the original promotion thread
PRRT_kwDOKoCXvs6qqJh5remained unresolved. The owning queue requires verified review of the actual refreshed pushed head and backlog drain before reporting end-to-end success; no old GitHub review is claimed to approve the refreshed commit.Promotion sync policy
A proven source-semantic gap blocks this promotion rather than being silently fixed only in the official copy. The owning queue must authorize a bounded source-repair cycle and obtain a new clean source review before refreshing native changes and provenance. Source modifications are never part of this promotion invocation.
Review follow-up: documentation-test scope (2026-10-16)
Removed the bespoke Markdown-parsing test in c2afd88, without moving or replacing the parser. All 20 retained literal tests pass, preserving the rule-owned positive/negative and exact authored-target controls. The dependency-closure build and repository format/lint passed.
The actual published incorrect/correct snippets were separately compiled once, with exactly one expected warning versus zero diagnostics and hash/target receipts. Literal tests do not continuously validate Markdown. This supersedes historical description claims about direct Markdown coverage; a standard documentation-testing system is outside this promotion.
Resolver-dedup and no-emitter/no-TCGC guards remain. Both actual PATCH examples were verified to retain numeric 202, so the positive control is not vacuous.
Review cleanup (October 19, 2026)
Moved the registered overlapping-service regression into
lro-missing-polling-metadata.test.ts; it still requires exactly one Core diagnostic and zero ARM warnings, covering the resolver side effect. Removed the extra per-rule files and redundant internal entry. Focused package-level public-entry coverage retains the throwing AutoRest/TCGC guards without duplicating rule behavior.Published in c0f894b. Fresh focused validation: 20 tests passed, package production typecheck, root
pnpm format, rootpnpm lint, and diff hygiene passed. The full test TypeScript project retains pre-existing diagnostics (25 before, 25 after); the exact-head baseline comparison found no new diagnostics, accounting explicitly for moved tests and any removed duplicate fixture. This is not a claim that the full test TypeScript project is error-free or that pending CI has passed. These current file-layout/coverage statements supersede earlier descriptions of the removed test files; historical validation remains historical.