Repository navigation
docs(spec): state the notify click-through default in the sourceObject / sourceId / actionUrl describes - #30742
Conversation
…t / sourceId / actionUrl describes A notify that writes none of sourceObject, sourceId and actionUrl links to the run's trigger record when the run has one; the spec describes and JSDoc now say so, with the exceptions the executor applies. Claude-Session: https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa Co-authored-by: Claude <[email protected]>
Claude-Session: https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa Co-authored-by: Claude <[email protected]>
📓 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 — 170 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 7dab66c728dfd6f048fe17efe439fbcf3f414c95 && git checkout 7dab66c728dfd6f048fe17efe439fbcf3f414c95
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 447226b222467709ed74ca99eaf808c178656b33 5c45995686283d9a7bbc1335b985276c5c7b265d && git checkout -B drift-repro 447226b222467709ed74ca99eaf808c178656b33 && git merge --no-ff 5c45995686283d9a7bbc1335b985276c5c7b265d
node scripts/docs-audit/affected-docs.mjs --json 447226b222467709ed74ca99eaf808c178656b33 |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa Contract-review-claim: session_01L6bhgTqqeHSwZYJmApbDCa · head 5c45995 · 2026-11-06T00:22Z Full review at Generated by Claude Code |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa 维护者速读
席位意见:契约复审一轮 PASS,没有必须改的项。它提了一条建议项:例外清单"除删除外的记录变更"漏了"创建前"( 席位核对 — ACCEPT · domain:spec#3 · head
|
Requested by Sales · project thread
Fixes #30689
Clause-②: no
Metadata-protocol: none
维护者速读
notify节点sourceObject/sourceId/actionUrl三个字段的 spec 说明文字(及其注释、生成的参考文档页),补上"三者都不写时,通知自动链接到触发本次运行的记录"这条默认行为及其例外。packages/spec/src/automation/io-node-config.zod.ts的三个.describe()与NotifyConfigSchema文档块;其次content/docs/references/automation/io-node-config.mdx的生成差异。pnpm --filter @objectstack/spec check:generated,预期输出 "All 14 generated artifacts are up to date"。What changes
packages/spec/src/automation/io-node-config.zod.tssourceObjectandsourceId.describe(): keep the pair rule (a half-written pair is dropped, now "not defaulted"), and add the default: whensourceObject,sourceIdandactionUrlare all left out, a run started by a record (a record change other than a delete, a time-relative sweep, an action on a record) links to that record, a run with no trigger record links nowhere, and an explicit pair or anactionUrlis kept as written.actionUrl.describe(): adds "written alone keeps the notification from linking to the record that started the run". This is the runtime's own sentence fromnotify-node.ts.NotifyConfigSchemadocblock that names every exception the executor applies: delete events, runs with no trigger record, an explicit pair oractionUrl, a half pair.content/docs/references/automation/io-node-config.mdx: regenerated bygen:docs, not edited by hand..changeset/30689-notify-click-through-default-describe.md:@objectstack/specpatch.No key, shape, default, refinement or export changes. Nothing outside
packages/spec/**changes, apart from the generated page and the changeset.The claims, checked against the runtime on
origin/mainab44ec94b(packages/services/service-automation/src/builtin/notify-node.ts, read only):triggerRecordOfreturns a trigger record only when the run context has bothobjectandrecord.id.defaultClickThroughOfreturns nothing when any of the three keys is written, and nothing forbeforeDelete/afterDelete.defaultClickThroughOf. So a half pair is dropped and is not defaulted.object+record:trigger-record-change;time-relative-trigger.ts,event: 'time_relative');action-execution.ts, which passesrecordandobject).trigger-apipassesrecord: payloadand noobject;buildAutomationContextsetsobjectand norecord;notify-node.test.tsunder "notify click-through defaults to the trigger record" pin each case.Tests
All readings below are on head
5c4599568(git rev-parse --short HEAD), worktree off baseab44ec94b. Exit codes were captured before any pipe.pnpm --filter @objectstack/spec buildunder the verify lock:VERDICT command-exit 0.pnpm --filter @objectstack/spec check:generated:content/docs/references/** stale;gen:docs: exit 0,All 14 generated artifacts are up to date.@objectstack/spectest files that import or coverio-node-config, under the lock:Test Files 9 passed (9),Tests 628 passed (628). They includeio-node-config.test.ts, whose/dropped at execute time/ipin still holds.pnpm --filter @objectstack/spec typecheck(tsc, scripts typecheck, test typecheck): exit 0.npx eslint --no-inline-config packages/spec/src/automation/io-node-config.zod.ts: exit 0.node scripts/check-changeset-no-major.mjs --base ab44ec94b --eventwith an offline PR event that carries this body's two declaration lines: exit 0. Its verdict: "LEVEL AXIS: this PR declares clause-②noand metadata-protocolnone… a non-protocol change atpatch".node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 96 commands, and every one ran.lint,formula,client-reactandobjectqldists). A sixth also exited 3 because it needs the full workspace build. Afterturbo run buildof those closures, and then the full build, all six re-ran at exit 0.--ranreconciliation:96 derived, 96 run, 0 NOT-MEASURED, 0 UNRUN.pnpm check:dev-prereqsexit 0,pnpm check:skill-frame-freshnessexit 0,node scripts/check-nul-bytes.mjsexit 0.Acceptance notes
NOTIFY_KEY_GUIDANCE.source(≈:137) is left as it is, on purpose. It says "the pair only takes effect together: a half-specified target is dropped". That is still true under the default. It speaks to an author who is moving a nestedsource: { object, id }onto the flat pair, so it is about a pair that is written, and the default never applies to such a pair. Nothing in it became false or incomplete for that reader.skills/objectstack-automation/SKILL.md:124comments the example asclick-through: a PAIR, else dropped. That is still true, and it is not the old "only takes effect together" sentence. It does not mention the trigger-record default. Not edited here, becauseskills/**is outside this card's surface.content/docs/automation/flows.mdx:352says "a half-specified click-through pair is dropped, as before". That is still true, and the page does not mention the default either. Not edited here: it is outside this card's surface.origin/main. The branch is 6 commits behind447226b22. Those commits touchpackages/spec/src/system/i18n-resolver*andplatform-locales*plus five unrelated changesets, and none of them touches this diff's files. The dispatch-gates derivation says none of them touched what its answer derives from.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa