Pin the one path that reaches an absent fabric-scoped list - #4371
Merged
Conversation
An optional fabric-scoped attribute holding no value is not advertised -- ValidatedElements decides support by whether state holds a value, so it stays out of AttributeList and a peer write is declined as unsupported. The only way to reach the member is the server's own code writing into it, which has no session to supply the fabric. Before conformance resolved through the base, such a write was accepted and stored an entry belonging to no fabric, unusable to anyone reading it. It is now refused and the member is left absent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Adds regression coverage ensuring local writes cannot create fabric-scoped list entries without a mandatory fabricIndex.
Changes:
- Tests rejection when no fabric is available.
- Confirms the absent list remains unset.
- Required build verification was not reported.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Contributor
|
Tick the box to add this pull request to the merge queue (same as
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up test for #4369, which made validation honor the conformance an element inherits. That change means a fabric-scoped list entry is held to the mandatory
FabricIndexthe seed field states. This pins the one way that rule can actually be reached, which nothing covered.Why there is only one path
A remote write cannot reach it.
ValidatedElementsdecides support by whether state holds a value (ValidatedElements.ts:211), so an optional attribute holdingundefinedstays out ofAttributeList(ServerBehaviorBacking.ts:105) and a peer write is declined as unsupported before it reaches the managed-value layer.That leaves the server's own code writing into the member — a behavior populating a fabric-scoped attribute at startup, which has no session to supply the fabric.
Before #4369 such a write was accepted and stored an entry belonging to no fabric, unusable to anyone reading it. It is now refused and the member is left absent.
Why the fixture is synthetic
No standard cluster states an officially optional fabric-scoped list. Of the 23 fabric-scoped list attributes in the model, the mandatory ones receive a synthesized default and the feature-gated ones become mandatory once their feature is selected, so neither is ever absent. The three that read as optional —
AccessControl.AuxiliaryAcl,GroupKeyManagement.GroupcastAdoption,Groupcast.Membership— are optional only because they are provisional, and their conformance becomes mandatory-under-feature once that lifts. They are also refused outright today by the provisional guards.So the fixture declares the shape directly rather than borrowing a cluster that does not exist.
Testing
Mutation-verified in both directions: reverting
astToFunctionto the element's own conformance fails this test withexpected [Function] to throw ConformanceError; restoring it passes.npm run format-verify,npm run lintand the fullnpm testpass.🤖 Generated with Claude Code