Repository navigation
fix(spec): name timeRelative.object in the time-relative arm of the flow type-mismatch upgrade entry - #30637
Conversation
…low type-mismatch upgrade entry The ADR-0087 semantic entry flow-record-read-and-decision-type-mismatch-refused said its refusal covers a time-relative flow sweeping the start node's objectName. The author-time gate types a time-relative flow's conditions against config.timeRelative.object when the start names no objectName, and against the start's objectName when that is the swept object; the surface and the matching reason sentence now say so. A migrations pin asserts the surface names config.timeRelative.object. Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_01L6bhgVugtCCwBs98FeR27P
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. 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): |
|
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P Contract reviewServed-tier: Inputs: card #30279 (body; comments 6650100066 triage, 6665805154 claim, 6667452302 os-dev-report), PR #30637 (body, 3-file list, net diff ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
No must-fix. Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P 维护者速读
席位核对ACCEPT · head
Generated by Claude Code |
Requested by Sales · project thread
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
Fixes #30279
Clause-②: no
Metadata-protocol: none
维护者速读
flow-record-read-and-decision-type-mismatch-refused的两段文字(surface与reason中对应的一句),写明时间相对流程的条件按被扫描对象config.timeRelative.object做类型检查:开始节点不写objectName时按它,开始节点的objectName就是被扫描对象时按objectName。os migrate meta与升级指南会把作者引向不完整的说明。packages/spec/src/migrations/entries/semantic/18.flow-record-read-and-decision-type-mismatch-refused.ts(surface末段与reason中 time-relative 一句);packages/spec/src/migrations/migrations.test.ts末尾新增的断言。pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrations/migrations.test.ts -t "names the object a time-relative flow",预期 1 个用例通过。What changes
The entry's
surfaceand onereasonsentence, written from the gate code (packages/lint/src/validate-expressions.ts, the flow walk:objectName = startObject ?? sweepObject, wheresweepObjectisconfig.timeRelative.objecton a time-relative flow; therun-failsoutcome is declared whensweepsTypedObject: sweepObject !== undefined && sweepObject === objectName). Every other field (id, kind, replacement, acceptanceCriteria) is byte-identical.surface, the time-relative tail…; and the same conditions, bare name included, of a time-relative flow (start config.timeRelative) sweeping the start node's objectName…; and the same conditions, bare name included, of a time-relative flow (start config.timeRelative) sweeping config.timeRelative.object, typed against that object when the start node names no objectName and against the start node's objectName when that is the swept objectreason, the time-relative sentenceA time-relative sweep launches each run with the swept row as its record, the same total row of the same object, so its conditions get the same refusal where 18.3.0 warned.A time-relative sweep launches each run with a row of the object it sweeps (config.timeRelative.object) as its record, the same total row of one object, so its conditions are typed against that object when the start node names no objectName, and against the start node's objectName when that is the swept object, and get the same refusal: where 18.3.0 warned on a sweep of the start node's objectName, and where a start that names no objectName got no verdict at all.Test. No test pinned the entry's text; a new top-level
describeinpackages/spec/src/migrations/migrations.test.tsasserts the surface matchessweeping config.timeRelative.object.Changeset.
.changeset/30279-time-relative-entry-surface.md,@objectstack/specpatch, with both declaration lines.Verification
All readings on head
bc0dd484unless named.Build, tests, typecheck
pnpm --filter @objectstack/spec build(under the verify lock): VERDICT command-exit 0.pnpm --filter @objectstack/spec check:generated: exit 0, "All 14 generated artifacts are up to date"; no artifact carries the entry text, nothing regenerated.pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrations/: 5 files, 198/198.@objectstack/specpnpm test: NOT MEASURED locally, reason: the shared verify lock answered queue-timeout (exit 99) twice behind a sibling's dogfood run (held 1094 s at the second try). Declared narrowing: the migrations directory above is the suite that reads the entry; CITest Coreruns the whole package.pnpm --filter @objectstack/spec typecheck(under the lock): VERDICT command-exit 0.eslint --no-inline-configover the entry file and the test file: exit 0.Ablation (scripts/ablation-replace.mjs; restored blob == HEAD, git diff HEAD empty)
sweeping the start node's objectName). On disk: FROM phrase count 0 → 1,sweeping config.timeRelative.object1 → 0, blobf0920514→01fd0df2;gen:migration-registryrerun, FROM phrase present in the generatedregistry.ts(1).the surface names config.timeRelative.object as the swept object: AssertionError: expected 'automation.Flow of a record-triggered…' to match /sweeping config\.timeRelative\.object/(Tests 1 failed, 157 skipped).f0920514),git diff HEADempty; registry regenerated;migrations.test.ts158/158.Derived gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackonbc0dd484: 80 families; all 80 run, exit codes captured per command before any pipe; 77 exit 0 on the first pass. Three answered exit 3 (PREREQUISITE NOT MET: an unbuilt@objectstack/formula, unbuilt workspacedist/, unbuiltobjectqldist/) on the first pass:check:doc-formula-expressions,check:dual-build-cjs-loads,check:lean-entry-closure; re-run after the closure buildcheck:type-check-debtperformed, each exit 0.--ranreconciliation with coded exit lines: "80 derived famil(ies) accounted for — 80 run, 0 NOT-MEASURED (a DERIVED zero — all 80 recorded an exit code and none of them is 3)".pnpm check:adr-0087-registrationexit 0 ("this PR adds no declared-breaking changeset"),pnpm check:doc-authoringexit 0.Acceptance notes
config.timeRelative.objectwhen the start names noobjectName, and declares therun-failsoutcome only whentimeRelative.objectequals the typed object, so a start naming another object keeps the warning; the TO sentences say exactly that.flow-time-relative-object-mismatchreadiness rule landed, a time-relative start whoseobjectNameis nottimeRelative.objectis refused by that rule; this entry'sreasonstill says "Any other flow keeps a warning", which stays true of the expression verdict itself. Noted, not changed.surfaceandreasoncarry none; the test comment carries none either.🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgVugtCCwBs98FeR27P