Repository navigation
fix(spec): the script.config.template tombstone points at the notify node's own template key - #25085
Conversation
…mplate key Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz
…he changeset Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D6F9axfoPzR7t8G1J7Ytzz
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 144 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 0a8549c523031e70eed5dc4ae335ee3ef60f409b && git checkout 0a8549c523031e70eed5dc4ae335ee3ef60f409b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a39389eb51738cc91fa450a1f3035d221ec65642 2318cdd2373e4c1404b2bade24fc928aff576af1 && git checkout -B drift-repro a39389eb51738cc91fa450a1f3035d221ec65642 && git merge --no-ff 2318cdd2373e4c1404b2bade24fc928aff576af1
node scripts/docs-audit/affected-docs.mjs --json a39389eb51738cc91fa450a1f3035d221ec65642 |
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flagsNo governed surface is touched, and Implemented-by: VERDICT: PASS Seat re-read of the check-runs at landing: all 42 runs on |
Closes #24965
Clause-②: no (prose only: no shape, key, default or accepted value moves)
What changed
The
script.config.templatetombstone inpackages/spec/src/automation/schemaless-node-config.zod.tstold authors that "stored templates live in the messaging service (sys_notification_template), not on the node". That text predates thenotifynode's owntemplatekey. This is the spec-lane half of execution card ② of ruling D on #24770 (decision6290342354, recorded by triage in6293376907). The services half is #24924.The prescription now reads:
The
retiredKey()call, the key's rejection and every other tombstone are unchanged. The generated referencecontent/docs/references/automation/schemaless-node-config.mdxwas regenerated withgen:docsand carries the same text. No test pins the old wording (git grep "stored templates live"on the base finds only the source and the generated page).Claims verified against the runtime (origin/main
2b1382a5b3)notifyhas its owntemplatekey naming anemail_template, andtemplateDatafills its placeholderspackages/spec/src/automation/io-node-config.zod.ts:585(template, described as anemail_templateitem'sname),:593(templateData);email_templateis a metadata type atpackages/spec/src/kernel/metadata-plugin.zod.ts:162packages/services/service-automation/src/builtin/notify-node.ts:465readscfg.template;:614-616puts{ template, templateData }in the payload, else{ title, body }sys_notification_templatethenpackages/services/service-messaging/src/email-channel.ts:330-333takespayload.template,:345callsemail.sendTemplate, and that branch returns before:378, the onlystore.load(…, 'email', …)packages/services/service-messaging/src/inbox-channel.ts:163-166takespayload.template,:182resolves the recipient locale,:188callsemail.renderTemplatesys_notification_templatepackages/services/service-messaging/src/messaging-service-plugin.ts:285builds the inbox channel with nostore; only the email (:398) and sms (:417) channels gettemplateStoresmsreadssys_notification_templatewhether or not a template is namedpackages/services/service-messaging/src/sms-channel.ts:285callsstore.load(topic, 'sms', …)unconditionally; the file reads nopayload.templatetitle/messagenotify-node.ts:508(title required when no template),io-node-config.zod.ts:559/:562The services side states the same reader set:
packages/services/service-messaging/src/objects/notification-template.object.ts:6-27(TEMPLATE_CHANNELS = ['email', 'sms']).One deviation from the dispatch wording. The dispatch said a named template "is used on every channel". The runtime shows otherwise for
sms: it has no template path and readssys_notification_template(falling back to the topic) even when the node names an email template. So the text names email and inbox as the channels that render the named template. It sayssys_notification_templateis read byemailonly when no template is named, and it does not say the same ofsms.Verification (head
2318cdd237)pnpm --filter @objectstack/spec build:VERDICT command-exit 0.pnpm --filter @objectstack/spec check:generated: beforegen:docs,✗ 1 of 14 artifact(s) stale: content/docs/references/**. After it:✓ All 14 generated artifacts are up to date.pnpm --filter @objectstack/spec test:Test Files 705 passed (705),Tests 21424 passed | 1 todo.pnpm --filter @objectstack/spec typecheck: exit 0.pnpm --filter @objectstack/spec test:repo:Test Files 72 passed (72),Tests 1237 passed (1237).node scripts/pm/dispatch-gates.mjs --commandsderived 105 commands: 104 exit 0 (six of them after building the@objectstack/lintclosure,@objectstack/clientand@objectstack/client-react, which they read as built output).check:dual-build-cjs-loadsis NOT MEASURED: it exited 3 (PREREQUISITE NOT MET) because it reads every workspace package'sdist/, which needs a whole-workspace build. CI runs it.dispatch-gates --ran:105 derived famil(ies) accounted for — 104 run, 1 NOT-MEASURED.Acceptance notes
.changeset/24965-script-template-tombstone.md:@objectstack/specpatch, because the tombstone text ships in the published runtime's rejection message. Not breaking, so it has no ADR-0087 marker.schemaless-node-config.zod.tswhen this was opened (all 14 open PRs' file lists were read).Generated by Claude Code