Skip to content

Add @featureFile decorators in Azure.ResourceManager and fix template suppression propagation#4664

Open
markcowl wants to merge 2 commits into
Azure:mainfrom
markcowl:markcowl/move-feature-fix-suppression
Open

Add @featureFile decorators in Azure.ResourceManager and fix template suppression propagation#4664
markcowl wants to merge 2 commits into
Azure:mainfrom
markcowl:markcowl/move-feature-fix-suppression

Conversation

@markcowl

@markcowl markcowl commented Jun 19, 2026

Copy link
Copy Markdown
Member

Changes

New decorators in Azure.ResourceManager namespace

Adds new decorators as alternatives to the Legacy versions:

  • @featureFiles\ (replaces @Azure.ResourceManager.Legacy.features)
  • @featureFile\ (replaces @Azure.ResourceManager.Legacy.feature)
  • @featureFileOptions\ (replaces @Azure.ResourceManager.Legacy.featureOptions)

The Legacy decorators remain unchanged for backward compatibility.

Fix @customAzureResource suppression propagation

Adjusts the \�rm-custom-resource-usage-discourage\ linter rule so that if a @@Suppress\ directive is applied to a model template with @customAzureResource, the suppression propagates to all instantiations of that template.

Files changed

  • \lib/decorators.tsp\ - New decorator declarations
  • \generated-defs/Azure.ResourceManager.ts\ - New type definitions
  • \src/resource.ts\ - New exports delegating to existing implementations
  • \src/tsp-index.ts\ - New decorator registrations
  • \src/rules/arm-custom-resource-usage-discourage.ts\ - Suppression propagation logic
  • Tests, README, and reference docs updated

@markcowl markcowl requested a review from bterlson as a code owner June 19, 2026 00:24
@markcowl markcowl added the int:azure-specs Run integration tests against azure-rest-api-specs label Jun 19, 2026
@markcowl markcowl requested a review from timotheeguerin as a code owner June 19, 2026 00:24
@markcowl markcowl added the int:azure-specs Run integration tests against azure-rest-api-specs label Jun 19, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added lib:azure-resource-manager Issues for @azure-tools/typespec-azure-core library emitter:autorest Issues for @azure-tools/typespec-autorest emitter meta:website TypeSpec.io updates labels Jun 19, 2026
@azure-sdk

azure-sdk commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

All changed packages have been documented.

  • @azure-tools/typespec-azure-resource-manager
  • @azure-tools/typespec-azure-rulesets
Show changes

@azure-tools/typespec-azure-resource-manager - feature ✏️

Add @featureFile, @featureFiles, and @featureFileOptions decorators in Azure.ResourceManager namespace as alternatives to the Legacy @feature, @features, and @featureOptions decorators. Add arm-feature-file-usage-discourage linting rule. Fix arm-custom-resource-usage-discourage rule to propagate suppressions from model templates to their instantiations.

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

Add @featureFile, @featureFiles, and @featureFileOptions decorators in Azure.ResourceManager namespace as alternatives to the Legacy @feature, @features, and @featureOptions decorators. Add arm-feature-file-usage-discourage linting rule. Fix arm-custom-resource-usage-discourage rule to propagate suppressions from model templates to their instantiations.

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

Add @featureFile, @featureFiles, and @featureFileOptions decorators in Azure.ResourceManager namespace as alternatives to the Legacy @feature, @features, and @featureOptions decorators. Add arm-feature-file-usage-discourage linting rule. Fix arm-custom-resource-usage-discourage rule to propagate suppressions from model templates to their instantiations.

@pkg-pr-new

pkg-pr-new Bot commented Jun 19, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@azure-tools/typespec-autorest@4664
npm i https://pkg.pr.new/@azure-tools/typespec-azure-resource-manager@4664
npm i https://pkg.pr.new/@azure-tools/typespec-azure-rulesets@4664

commit: 71d52db

@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

⚡ Benchmark Results

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

Metric Baseline Current Change
total 🔴 1.01s 🔴 1.07s +6.3% 🔴
loader 🟡 305.6ms 🟡 328.3ms +7.4% 🔴
resolver 🟢 40.1ms 🟢 42.3ms +5.6% 🔴
checker 🟡 364.2ms 🟡 386.4ms +6.1% 🔴
 ↳ validation/@typespec/http 🟡 15.5ms 🟡 16.6ms +7.4% 🔴
linter 🟡 215.2ms 🟡 227.8ms +5.8% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🔴 26.7ms 🔴 28.7ms +7.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🔴 27.8ms 🔴 29.8ms +6.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 33.3ms 🔴 35.7ms +7.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 32.7ms 🔴 34.7ms +6.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-child-resources 🔴 21.1ms 🔴 22.3ms +6.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 19.7ms 🔴 20.7ms +5.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🔴 29.8ms 🔴 31.6ms +6.0% 🔴
emit 🔴 6.04s 🔴 6.40s +6.0% 🔴
 ↳ emit/@azure-tools/typespec-python 🔴 2.25s 🔴 2.39s +6.2% 🔴
 ↳ emit/@typespec/http-client-js 🔴 571.0ms 🔴 603.4ms +5.7% 🔴
 ↳ emit/@typespec/openapi3 🟢 107.9ms 🟢 115.2ms +6.8% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 93.8ms 🟢 100.0ms +6.6% 🔴
Full details – comparing c93df9f vs baseline rolling-baseline-1a09577-3e6a2b2 (rolling baseline (20 main runs))
Metric Baseline Current Change
total 🔴 1.01s 🔴 1.07s +6.3% 🔴
loader 🟡 305.6ms 🟡 328.3ms +7.4% 🔴
resolver 🟢 40.1ms 🟢 42.3ms +5.6% 🔴
checker 🟡 364.2ms 🟡 386.4ms +6.1% 🔴
validation 🟢 84.6ms 🟢 88.8ms +5.0%
 ↳ validation/@azure-tools/typespec-azure-core 🟡 12.6ms 🟡 13.5ms +7.6%
 ↳ validation/@typespec/http 🟡 15.5ms 🟡 16.6ms +7.4% 🔴
 ↳ validation/@typespec/rest 🟢 1.6ms 🟢 1.7ms +3.8%
 ↳ validation/@typespec/versioning 🔴 50.9ms 🔴 52.9ms +3.8%
 ↳ validation/compiler 🟢 3.8ms 🟢 4.0ms +3.5%
linter 🟡 215.2ms 🟡 227.8ms +5.8% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/auth-required 🟢 0.1ms 🟢 0.1ms +8.2%
 ↳ linter/@azure-tools/typespec-azure-core/bad-record-type 🟢 0.6ms 🟢 0.6ms +4.2%
 ↳ linter/@azure-tools/typespec-azure-core/byos 🟢 8.4ms 🟢 8.9ms +6.8%
 ↳ linter/@azure-tools/typespec-azure-core/casing-style 🟢 1.5ms 🟢 1.5ms +4.2%
 ↳ linter/@azure-tools/typespec-azure-core/composition-over-inheritance 🟢 0.2ms 🟢 0.2ms +4.3%
 ↳ linter/@azure-tools/typespec-azure-core/documentation-required 🟢 2.0ms 🟢 2.1ms +6.0%
 ↳ linter/@azure-tools/typespec-azure-core/friendly-name 🟢 1.4ms 🟢 1.5ms +4.6%
 ↳ linter/@azure-tools/typespec-azure-core/key-visibility-required 🟢 0.4ms 🟢 0.4ms +7.7%
 ↳ linter/@azure-tools/typespec-azure-core/known-encoding 🟢 0.5ms 🟢 0.5ms +3.5%
 ↳ linter/@azure-tools/typespec-azure-core/long-running-polling-operation-required 🟢 0.8ms 🟢 0.9ms +7.1%
 ↳ linter/@azure-tools/typespec-azure-core/no-case-mismatch 🟢 0.7ms 🟢 0.7ms +8.8%
 ↳ linter/@azure-tools/typespec-azure-core/no-closed-literal-union 🟢 1.0ms 🟢 1.1ms +6.3%
 ↳ 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 +6.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-explicit-routes-resource-ops 🟢 0.2ms 🟢 0.2ms +8.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-format 🟢 0.8ms 🟢 0.9ms +4.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-generic-numeric 🟢 0.8ms 🟢 0.9ms +4.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🔴 26.7ms 🔴 28.7ms +7.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-legacy-usage 🟢 2.1ms 🟢 2.2ms +6.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-multiple-discriminator 🟢 0.2ms 🟢 0.3ms +10.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-nullable 🟢 0.4ms 🟢 0.4ms +6.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-offsetdatetime 🟢 2.0ms 🟢 2.0ms +4.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-openapi 🟢 2.3ms 🟢 2.4ms +1.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-private-usage 🟢 3.2ms 🟢 3.4ms +6.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🔴 27.8ms 🔴 29.8ms +6.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 33.3ms 🔴 35.7ms +7.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rest-library-interfaces 🟢 0.1ms 🟢 0.1ms +13.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 7.7ms 🟢 8.3ms +8.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-rpc-path-params 🟢 0.4ms 🟢 0.4ms +8.6%
 ↳ linter/@azure-tools/typespec-azure-core/no-string-discriminator 🟢 0.1ms 🟢 0.2ms +9.0%
 ↳ 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 +6.3%
 ↳ linter/@azure-tools/typespec-azure-core/operation-missing-api-version 🟢 0.4ms 🟢 0.4ms +6.6%
 ↳ linter/@azure-tools/typespec-azure-core/request-body-problem 🟢 0.5ms 🟢 0.5ms +4.3%
 ↳ linter/@azure-tools/typespec-azure-core/require-versioned 🟢 0.1ms 🟢 0.1ms +5.6%
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 32.7ms 🔴 34.7ms +6.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/rpc-operation-request-body 🟢 0.7ms 🟢 0.7ms +6.6%
 ↳ linter/@azure-tools/typespec-azure-core/spread-discriminated-model 🟢 0.5ms 🟢 0.5ms +2.1%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 7.6ms 🟢 8.1ms +7.2%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-operations 🟢 0.3ms 🟢 0.3ms +10.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-child-resources 🔴 21.1ms 🔴 22.3ms +6.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-lifecycle-operations 🟢 0.3ms 🟢 0.3ms +4.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-common-types-version 🟡 12.1ms 🟡 12.6ms +3.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-no-key 🟢 0.2ms 🟢 0.2ms +1.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-usage-discourage 🟢 0.1ms 🟢 0.1ms +6.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-delete-operation-response-codes 🟢 5.0ms 🟢 4.5ms -10.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-feature-file-usage-discourage 🟢 0.0ms 🟢 0.1ms +100.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-path-casing-conflicts 🟡 17.0ms 🟡 17.3ms +2.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-record 🟢 0.6ms 🟢 0.6ms +2.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-post-operation-response-codes 🟢 1.4ms 🟢 1.4ms -0.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-put-operation-response-codes 🟢 0.2ms 🟢 0.2ms -1.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-action-no-segment 🟢 0.4ms 🟢 0.4ms +0.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-duplicate-property 🟢 0.4ms 🟢 0.4ms +3.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator 🟢 0.1ms 🟢 0.1ms -8.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb 🟢 0.2ms 🟢 0.2ms +1.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property 🟢 0.3ms 🟢 0.3ms +4.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format 🟢 0.2ms 🟢 0.2ms +3.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars 🟢 0.5ms 🟢 0.5ms +2.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-name-pattern 🟢 0.1ms 🟢 0.1ms +2.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation 🟢 0.5ms 🟢 0.5ms +0.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 9.0ms 🟢 9.1ms +1.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-patch 🟢 0.8ms 🟢 0.8ms -2.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars 🟢 0.4ms 🟢 0.4ms +1.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state 🟢 0.4ms 🟢 0.4ms -0.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/beyond-nesting-levels 🟢 0.2ms 🟢 0.2ms +3.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/empty-updateable-properties 🟢 0.4ms 🟢 0.4ms +0.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation 🟢 0.1ms 🟢 0.1ms +4.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 19.7ms 🔴 20.7ms +5.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint 🟢 0.1ms 🟢 0.1ms +0.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-x-ms-identifiers 🟢 1.0ms 🟢 1.0ms -1.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-empty-model 🟢 0.3ms 🟢 0.3ms +1.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-override-props 🟢 0.3ms 🟢 0.3ms +1.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-reserved-resource-property 🟢 0.2ms 🟢 0.2ms +3.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-resource-delete-operation 🟢 0.5ms 🟢 0.5ms +1.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🔴 29.8ms 🔴 31.6ms +6.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/patch-envelope 🟢 0.4ms 🟢 0.4ms +3.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/resource-name 🟢 0.4ms 🟢 0.4ms +1.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/secret-prop 🟢 5.4ms 🟢 5.1ms -5.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/unsupported-type 🟢 0.7ms 🟢 0.7ms -2.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/version-progression 🟢 0.3ms 🟢 0.3ms -1.7%
 ↳ linter/@azure-tools/typespec-client-generator-core/property-name-conflict 🟢 2.3ms 🟢 2.4ms +3.2%
 ↳ linter/@azure-tools/typespec-client-generator-core/require-client-suffix 🟢 1.7ms 🟢 1.7ms +5.0%
emit 🔴 6.04s 🔴 6.40s +6.0% 🔴
 ↳ emit/@Azure-Tools 🟢 0.0ms 🟢 0.0ms +0.0%
 ↳ emit/@azure-tools/typespec-autorest 🟢 125.4ms 🟢 131.5ms +4.9%
 ↳ emit/@azure-tools/typespec-python 🔴 2.25s 🔴 2.39s +6.2% 🔴
 ↳ emit/@typespec 🟢 0.0ms 🟢 0.0ms +0.0%
 ↳ emit/@typespec/http-client-js 🔴 571.0ms 🔴 603.4ms +5.7% 🔴
 ↳ emit/@typespec/openapi3 🟢 107.9ms 🟢 115.2ms +6.8% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 93.8ms 🟢 100.0ms +6.6% 🔴
 ↳ emit/@typespec/openapi3/write 🟢 13.8ms 🟢 14.8ms +6.8%

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)

@azure-sdk

Copy link
Copy Markdown
Collaborator

You can try these changes here

🛝 Playground 🌐 Website

Comment thread .chronus/changes/markcowl-move-feature-fix-suppression-2026-5-18-16-41-6.md Outdated
Comment thread .chronus/changes/markcowl-move-feature-fix-suppression-2026-5-18-16-41-6.md Outdated
@markcowl markcowl force-pushed the markcowl/move-feature-fix-suppression branch from 01d1643 to f493b8e Compare June 30, 2026 01:29
markcowl added a commit to markcowl/azure-rest-api-specs that referenced this pull request Jun 30, 2026
…nager namespace

Replace all usages of Legacy decorators with new Azure.ResourceManager equivalents:
- @Azure.ResourceManager.Legacy.features -> @Azure.ResourceManager.featureFiles
- @Azure.ResourceManager.Legacy.feature -> @Azure.ResourceManager.featureFile
- @Azure.ResourceManager.Legacy.featureOptions -> @Azure.ResourceManager.featureFileOptions

Updated package.json to use PR build packages from Azure/typespec-azure#4664:
- @azure-tools/typespec-azure-resource-manager
- @azure-tools/typespec-autorest
- @azure-tools/typespec-azure-rulesets

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@markcowl markcowl changed the title Move @feature decorator to Azure.ResourceManager namespace and fix template suppression propagation Add @featureFile decorators in Azure.ResourceManager and fix template suppression propagation Jun 30, 2026
@markcowl markcowl force-pushed the markcowl/move-feature-fix-suppression branch 3 times, most recently from 1cd0dd6 to 0dc60f5 Compare June 30, 2026 21:36
@markcowl

Copy link
Copy Markdown
Member Author

Note: will follow up with deprecation of the old decorators next sprint, and removal afterward.

markcowl and others added 2 commits July 10, 2026 13:51
… suppression propagation

- Add @featureFile, @featureFiles, @featureFileOptions decorators in Azure.ResourceManager
  namespace as alternatives to the Legacy @feature, @features, @featureOptions decorators
- Fix arm-custom-resource-usage-discourage rule to propagate suppressions from model
  templates to their instantiations
- Regenerate reference docs
- Update tests to use new decorator names

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

The hasSuppressedCustomResourceTemplate function no longer requires
getCustomResourceOptions on the template instance itself. Since the
outer guard already checks isCustomAzureResource (which walks the
baseModel chain), we only need to find a template instance in the
chain with the suppression directive.

This enables suppression propagation through templates that inherit
@customAzureResource via extends rather than having it directly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@markcowl markcowl force-pushed the markcowl/move-feature-fix-suppression branch from a529773 to 71d52db Compare July 10, 2026 20:52
@markcowl markcowl changed the base branch from release/june-2026 to main July 10, 2026 20:52
@microsoft-github-policy-service microsoft-github-policy-service Bot added eng lib:azure-core Issues for @azure-tools/typespec-azure-core library labels Jul 10, 2026
@markcowl markcowl closed this Jul 10, 2026
@markcowl markcowl reopened this Jul 10, 2026
@markcowl markcowl added this pull request to the merge queue Jul 10, 2026
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Jul 10, 2026
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 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-resource-manager Issues for @azure-tools/typespec-azure-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.

[design]: Remove need to use legacy and private decorators in Network spec

3 participants