docs(configure): say which channels render a Notification Template - #247
docs(configure): say which channels render a Notification Template#247os-zhuang wants to merge 1 commit into
Conversation
The page described Templates as the render stage for every delivery — pipeline step 3 and the Notification Templates section. Traced on objectstack origin/main: only the email and SMS channels read sys_notification_template (both take the NotificationTemplateStore and call renderNotification). The inbox channel is registered without that store; it writes sys_inbox_message from the notification's own title/body, and its notify-template path renders a sys_email_template row through IEmailService.renderTemplate instead. Since a notification with no explicit channels goes to inbox alone, the delivery an admin is most likely looking at is the one that ignores the template row they are editing. Enumerates the three channels, names sys_email_template only as the object the inbox template path consults (the Email page owns it), and describes today's wiring without forecasting a seam. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016TUrhcggSFrYctvp5dsV1A
|
Review is ACCEPT-clean, but this PR is NOT being merged: the required
The reading, taken from the job rather than the aggregate
A What happened, diagnosed rather than guessedRun
Why it has not been re-runI cannot: the GitHub MCP session is returning ⛔ I am not working around it. No empty commit, no close-and-reopen, no merging on the strength of the two green jobs, and no local-run substitution: the dev's What the next session needs to do — nothing else is outstanding
The branch is based on Generated by Claude Code |
|
Update — the re-run is now in flight. My previous comment said I could not trigger one; that is no longer true and I am correcting it rather than leaving it to mislead. The GitHub MCP channel reconnected, and So the outstanding action on this PR is no longer "someone must trigger a re-run" — it is simply wait for attempt 2 and read the
Nothing else about this PR has changed. Generated by Claude Code |
Fixes #147
content/docs/configure/notifications.mdxdescribed Templates as the render stage for every delivery. Only the email and SMS channels work that way. The in-app inbox does not — andinboxis the default channel, so the delivery an admin is most likely looking at is the one that ignores the Notification Template row they are editing.What changed (one file, prose only)
### What each channel rendersinboxis the default channelEvidence — call path traced on
objectstackorigin/main@9e0ba21The card measured at
2866d5f9and the dispatch re-measured strings ate452ad5; upstreammainhas since moved to9e0ba21, so this was re-traced rather than re-read.messaging-service.ts:884—const channels = input.channels?.length ? input.channels : ['inbox'];. Confirmsinboxis the always-on default.messaging-service.tsfans each delivery out tothis.channels.get(channelId).send(...); each channel renders itself.NotificationTemplateStore(template-renderer.ts,TEMPLATE_OBJECT = 'sys_notification_template') is imported byemail-channel.ts,sms-channel.ts,messaging-service-plugin.tsand the barrel — and by nothing else.git grep sys_notification_templateoverservice-messaging/srcreturns zero hits ininbox-channel.ts.messaging-service-plugin.ts:249and:267construct the email and SMS channels withstore: templateStore. Line:159constructs the inbox channel with{ getData, getEmail, getDefaultTemplateLocale }— no store, so the notification-template renderer never reaches it.email-channel.ts:225/sms-channel.ts:125—store.load(n.topic, 'email' | 'sms', locale)thenrenderNotification(...), whose no-row fallback is the notification's own title/body.inbox-channel.ts:125-126—let title = n.title; let bodyMd = n.body;, written intosys_inbox_messageat:164-174. Title falls back to the topic at emit time (messaging-service.ts:917/:949,str(payload.title) ?? input.topic).inbox-channel.ts:132-162— the notifytemplatepath callsIEmailService.renderTemplateover asys_email_templaterow resolved by(name, locale), and returnsTEMPLATE_UNSUPPORTED(graded permanent at:206) when no email service provides the method.So the premise holds at current upstream
main: email and SMS render the object this page documents, the inbox never does.One deviation from the dispatch, called out
The dispatch asked me to cite the upstream gap note — the
service-messagingCHANGELOG sentence that the inbox "has no locale-capable rendering seam to the email-template subsystem today". That sentence is stale, and stale within its own release. It belongs to the#9205changeset under17.1.0; the#9225changeset in the same17.1.0block built exactly that seam ("the inbox channel consumes it — localizedsys_email_templatecontent now reachessys_inbox_message"). What is still missing is a different seam: inbox tosys_notification_template, which no upstream note currently calls a tracked gap.Citing the stale sentence would have put a false claim in the docs. So the page states today's wiring and explicitly does not forecast a seam ("This page describes the wiring as it stands; it does not forecast an inbox seam to these rows"), which is the intent of that instruction. Flagging it rather than deciding quietly.
Scope
sys_email_templateis named once, as the object the inbox template path consults, and links to Email — that page owns it (configure/email.mdx:57), so there was no ownership gap to file.role:tier callout (now line 139, line 137 before this diff) is untouched — that region belongs to the in-flight card [finding] No page defines the org-membership tier vocabulary —delegated_adminis addressable in two places and explained in none #153. Hunk ranges are 28, 44, 157 and 176; none reaches it.operate/audit-logs.mdxuntouched. No locale siblings touched:git diff --name-statusagainst the base is a singleMline.messaging-service.tshas no occurrence oflocale; the channels takepayload.localeelse a deployment default). That is a different claim from the one this card adjudicated, so it is recorded in [finding]configure/notifications.mdxsays a template's locale is "matched to the recipient" — the delivery path never reads a recipient locale #246 for triage instead of being ridden in.Verification — all runs on
0510eb8, the head of this branchNothing was edited after these runs; the tree they measured is this commit.
pnpm turbo run build --force --concurrency=2—Tasks: 1 successful, 1 total, wrapperVERDICT command-exit 0.pnpm turbo run test --force --concurrency=2—Tasks: 1 successful, 1 total, wrapperVERDICT command-exit 0.node .github/scripts/check-locale-surface.mjsfrom the repo root — exit0: "every advertised URL has a source file and every source file is advertised; bothllmsbodies carry every en-only page title and none from the other locales; and no page slug in the content tree contains a dot".The locale-surface oracle is unchanged, which is the positive evidence that this PR adds and drops no page. The gate derives it from
content/docs/andapps/docs/lib/i18n.ts; it reports 79 logical pages over 8 locales = 397 docs entries, andgit diff --name-status --diff-filter=ADRagainst the base overcontentandapps/docs/lib/i18n.tsreturns zero rows — no file added, deleted or renamed, so the inventory the oracle is built from is byte-identical to base. The artifacts agree:sitemap.xml409 URLs read, 409 expected, 0 unexpected, 0 missing; bothllmsbodies 60/60 with 0 unexpected and 0 missing.No changeset:
objectoshas nopackages/publish flow and this is a docs-content change.Generated by Claude Code