Out-of-scope finding from the #7084/#7085 sweep pack (PR #7111). Recorded unassigned — a different card class (form-descriptor face, service-automation), explicitly fenced out of that PR's scope.
Anchor
packages/services/service-automation/src/builtin/notify-node.ts:166 and :170 (measured on origin/main @ f5a9bc2f3), the hand-written configSchema literal that drives the Studio form:
description: 'Object name of the record the notification links to (writes sys_notification.source_object). Requires sourceId.',
...
description: 'Record id the notification links to (writes sys_notification.source_id). Requires sourceObject. The inbox synthesizes a `/{object}/{id}` deep-link from these.',
Why it is the same defect as #7085, on a different face
#7085 fixed the spec Zod .describe() strings (PR #7111): the schema deliberately accepts the half pair and the executor DROPS a half-specified click-through target at execute time (the module JSDoc's recorded contract in io-node-config.zod.ts), so "Requires ..." was a phantom requirement. The descriptor literal carries the same phantom "Requires ..." wording and reaches a different reader — the Studio form author — where it is just as wrong: a half pair saves green, publishes green, and the link silently never renders (#2675's invisible-failure shape).
Why PR #7111 did not sweep it
Suggested shape
Align the two descriptor description strings with the vocabulary PR #7111 borrowed from the module JSDoc ("Only takes effect together with sourceId — a half-specified click-through target is dropped at execute time, so the inbox never renders a dead link."), keeping the descriptor's extra deep-link sentence if wanted. String-only; no key/type/required change, so the form-Zod key-set ledger is untouched.
Refs
#7085 (the spec-face fix, PR #7111), #6762 (class specimen), #2675 (pair-only click-through), #4045 (form/Zod provenance split).
Out-of-scope finding from the #7084/#7085 sweep pack (PR #7111). Recorded unassigned — a different card class (form-descriptor face,
service-automation), explicitly fenced out of that PR's scope.Anchor
packages/services/service-automation/src/builtin/notify-node.ts:166and:170(measured onorigin/main@f5a9bc2f3), the hand-writtenconfigSchemaliteral that drives the Studio form:Why it is the same defect as #7085, on a different face
#7085 fixed the spec Zod
.describe()strings (PR #7111): the schema deliberately accepts the half pair and the executor DROPS a half-specified click-through target at execute time (the module JSDoc's recorded contract inio-node-config.zod.ts), so "Requires ..." was a phantom requirement. The descriptor literal carries the same phantom "Requires ..." wording and reaches a different reader — the Studio form author — where it is just as wrong: a half pair saves green, publishes green, and the link silently never renders (#2675's invisible-failure shape).Why PR #7111 did not sweep it
io-node-form-zod-ledger.test.ts) compares KEY SETS off.shape, not description strings — so the two faces do not fail any gate by disagreeing, and the descriptor was already drifted before docs(spec): align GroupingConfig.fields & NotifyConfig sourceObject/sourceId describes with the measured acceptance face (#7084, #7085) #7111 (itssourceIddescription carries an extra deep-link sentence the Zod describe never had).Suggested shape
Align the two descriptor
descriptionstrings with the vocabulary PR #7111 borrowed from the module JSDoc ("Only takes effect together with sourceId — a half-specified click-through target is dropped at execute time, so the inbox never renders a dead link."), keeping the descriptor's extra deep-link sentence if wanted. String-only; no key/type/required change, so the form-Zod key-set ledger is untouched.Refs
#7085 (the spec-face fix, PR #7111), #6762 (class specimen), #2675 (pair-only click-through), #4045 (form/Zod provenance split).