Repository navigation
fix(spec): the two step-18 flow-binding D3 entries name only a text-slot hole and a CEL expression as the reads to rename - #23384
Conversation
…lot hole and a CEL expression as the reads to rename The replacement text of flow-binding-name-dollar-refused and flow-binding-variable-dollar-name-refused still listed "a single-brace token in a value position" among the reads of a renamed variable. No protocol-18 value position reads a flow variable through a single-brace token: a value slot is a CEL value envelope or a literal, and a token there is refused. The generated upgrade guide and spec-changes.json project this text. Text only; a spec patch changeset carries the FROM -> TO sentence. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
📓 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 — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 38509435041 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
Queue note ·
Generated by Claude Code |
Fixes #23338
Clause-②: no
Two ADR-0087 D3 semantic entries of protocol 18 still told an upgrading author to rename "a single-brace token in a value position" among the reads of a renamed variable. No protocol-18 value position reads a flow variable through a single-brace token, so this PR takes the phrase out of both
replacementtexts. It is a text-only change, following triage's direction (comment 6155971636): the card's "Wanted", as written.Dispatched by the
domain:specseat 2 PM, sessionsession_01BRQ9Mp1yH7R1az6MaUM18H, under its claim comment 6159719865.What changes
packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.tsand18.flow-binding-variable-dollar-name-refused.ts: the last clause ofreplacementnames a text-slot hole and a CEL expression, and nothing else. Each entry keeps itsid,fromVersion,toVersion,surface,reason,acceptanceCriteriaand every other field byte-identical. No schema, door, conversion or entry id changes..changeset/23338-flow-binding-d3-replacement-reads.md: an@objectstack/specpatch, with the FROM → TO sentence.The new wording is the one PR #23252 gave both entries' changesets (
22502and22572, now under.changeset/pre/), and the one PR #23336 put in the18.0.0-next.0entries ofpackages/spec/CHANGELOG.md: "(a text-slot hole, a CEL expression)". The generated upgrade guide andspec-changes.jsonnow say the same as those release notes.Why it is true: S6 (
615c69604) made every CRUDfilteroperand a value slot, and S7 (7958bdf36) deleted the single-brace resolver. A value slot takes a CEL value envelope or a literal, and a{…}token there is refused. One measured nuance is stated in the changeset, so that its sentence stays true: a CRUDfilteroperand that is one whole query placeholder ({current_user_id},{today}) is handed on to the query engine untouched (thefilterOperandarm ofvalueSlotTemplateRefusals, judged byclassifyFlowFilterOperandString). That placeholder reads no flow variable, so a renamed variable has no read there.The grep over every step-18 entry
At base
713f23185, overpackages/spec/src/migrations/entries/**/18.*(769 files):git grep -n "single-brace token in a value position"over the whole repository: exactly 2 hits, the two entries above, and both are corrected here. At head6bf205cb8the only hit is the FROM cell of this PR's changeset.git grep -n -i -E "single[- ]brace|value position|\{token\}|brace token|\{var\}|single-curly|template dialect|template token": 22 hits in 9 entries. Apart from the two above, none reads the token as live:18.flow-builtin-node-config-values-refused.ts:40, :57, :86: a{token}in a number or boolean slot is refused as the wrong type; at a plain string key it parses and registers as a literal;httpinterpolated "once" and "interpolates nothing now". No read is claimed.18.flow-text-slot-single-brace-refused.ts(5 hits): the text-slot refusal.18.flow-text-slot-unbound-dollar-root-refused.ts:32, :35: "In 17.x the slot was a plain string read by the single-brace interpolator", in the past tense, and a refusal's remedy.18.flow-value-slot-template-dialect-refused.ts(4 hits): the value-slot refusal, with the query-placeholder carve-out named.18.flow-write-node-stored-metadata-target-refused.ts:37: a{token}objectNamecannot be read as a name.18.translation-flow-screen-title-text-slot-refused.ts(4 hits): the translated-heading refusal.18.view-filter-rule-scalar-operator-array-refused.ts:25: a filter rule's "value position", which has nothing to do with templates.braceorinterpolatoutside the two spellings above: 29 more hits in 13 entries. Each is in the past tense, a refusal, or another dialect (${…}in UI action URLs, a datasource secret, dashboard documents). None names a single-brace read as live.The step-18 rationale fragments in
registry.ts.templatecarry no such sentence either. Theirsingle-bracehits are refusals, plus the statement that the single-brace interpolator is deleted.Generated projections and pins
git grep "Rename every read of the old name"finds only the two entries.registry.ts,spec-changes.jsonand thecontent/docs/protocol-upgrade/pages are gitignored build output, so nothing was regenerated or committed.build-upgrade-guide.ts --outandbuild-spec-changes.ts --outwere written to a scratch path. The old phrase has 0 hits in each (grep exit 1). The new sentence has 2 hits in the guide and 4 inspec-changes.json(exit 0). In the builtdist/migrations/index.mjsandindex.js, the old phrase is absent (exit 1) and the new sentence has 2 hits each.replacementtext.flow-bound-variable-name.test.tspins only these two entries'surface,conversionIdsand rationale id, andmigrations.test.tsjudges the shape of every semantic entry. No new test is added for a text fix.Verification
All at head
6bf205cb8, on base713f23185.pnpm --filter @objectstack/spec build, under the verify lock:VERDICT command-exit 0.pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrations src/automation/flow-bound-variable-name.test.ts: 5 files, 323 tests passed.pnpm --filter @objectstack/spec run typecheck(tsc --noEmit,check:scripts-typecheck,check:test-typecheck): exit 0.pnpm turbo run build --filter=!@objectstack/docs --concurrency=2, under the lock: 75 successful, 75 total. This build is the prerequisite of three derived gates.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths, gives 82 commands. Each ran with its exit code captured before any pipe.PREREQUISITE NOT MET, nothing built yet):check:doc-formula-expressions,check:dual-build-cjs-loadsandcheck:lean-entry-closure. After the full build, all three exited 0.check-adr-0087-registration,check-empty-changeset,check-changeset-no-major,check:upgrade-guide,check:spec-changes,check:authorable-surface,check:doc-authoringandcheck:nul-bytes.--ran: "82 derived famil(ies) accounted for — 82 run, 0 NOT-MEASURED (a DERIVED zero — all 82 recorded an exit code and none of them is 3)."eslint --no-inline-config --format jsonover the 3 changed files. The 2.tsfiles have 0 errors and 0 warnings. The config ignores the.mdchangeset.eslint.config.mjsenables no type-aware linting (noparserOptions.project), so the diff cannot move the verdict on an untouched file.Acceptance notes
origin/mainmoved to28e294f45after the gates ran. Its one new commit (plugin-sharing and runtime) touches neither entry and nothing inpackages/spec.Generated by Claude Code