Filing unassigned — recording, not claiming. Found during the #9689 R3 patch round's consumer sweep; same class as #11409 (skill docs) and #11410 (field designer form), but a third distinct surface with its own fix site, so it gets its own card rather than riding either.
Measured
packages/lint/src/data-model-rules.ts (rule relationship/delete-behavior, severity suggestion):
if(def.deleteBehavior===undefined){issues.push({severity: 'suggestion',rule: 'relationship/delete-behavior',message: `master_detail "${obj.name}.${fieldName}" → ${parent} should declare deleteBehavior (cascade/restrict/set_null)`,path: `${fieldPath}.deleteBehavior`,fix: "deleteBehavior: 'cascade'",});}The message enumerates set_null as one of the three values an author may declare on a master_detail. Since PR #11406 (#9689, maintainer ruling 2026-08-19), an authored deleteBehavior: 'set_null' on a master_detail is a named parse-time rejection — so this suggestion, followed literally, walks the author into a publish-time error. The fix payload ('cascade') is fine; only the message enumeration is stale.
Note the rule itself is healthy and unaffected by #9689's idempotent-materialization change: it consumes RAW authored objects (lintDataModel(objects: any[]) — verified from packages/cli/test/data-model-rules.test.ts, which passes raw literals), where absent has always meant "not authored".
Suggested shape (not prescribing)
Message becomes (cascade/restrict) for master_detail, possibly with the same outcome-naming courtesy as the #9689 rejection message (set_null is not honored on this type; use a lookup if children must survive the parent). One string edit plus its test.
Refs: #9689, PR #11406, #11409, #11410.
Generated by Claude Code
Filing unassigned — recording, not claiming. Found during the #9689 R3 patch round's consumer sweep; same class as #11409 (skill docs) and #11410 (field designer form), but a third distinct surface with its own fix site, so it gets its own card rather than riding either.
Measured
packages/lint/src/data-model-rules.ts(rulerelationship/delete-behavior, severitysuggestion):The message enumerates
set_nullas one of the three values an author may declare on amaster_detail. Since PR #11406 (#9689, maintainer ruling 2026-08-19), an authoreddeleteBehavior: 'set_null'on amaster_detailis a named parse-time rejection — so this suggestion, followed literally, walks the author into a publish-time error. Thefixpayload ('cascade') is fine; only the message enumeration is stale.Note the rule itself is healthy and unaffected by #9689's idempotent-materialization change: it consumes RAW authored objects (
lintDataModel(objects: any[])— verified frompackages/cli/test/data-model-rules.test.ts, which passes raw literals), where absent has always meant "not authored".Suggested shape (not prescribing)
Message becomes
(cascade/restrict)formaster_detail, possibly with the same outcome-naming courtesy as the #9689 rejection message (set_nullis not honored on this type; use alookupif children must survive the parent). One string edit plus its test.Refs: #9689, PR #11406, #11409, #11410.
Generated by Claude Code