Repository navigation
fix(spec): os migrate meta --stored lists a stored connector_action whose connectorConfig.input carries a {…} token - #28249
Conversation
…de, so a connector_action's connectorConfig.input token is listed The flow value-slot detector judged a node's `config` alone, so the slot the ledger roots in a connector_action node's `connectorConfig.input` was never read: `os migrate meta --stored` named nothing for a stored row that `registerFlow` refuses at boot. Both flow detectors now share one walk that hands the judge the whole node, as registerFlow and objectstack validate do, and split its refusals by block: `config` under flow-value-slot-template-dialect-refused, `connectorConfig` under connector-action-input-value-slot-judged, the D3 entry that refuses it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz8wBXN5R4YRtm5e5r
…-vgdwpp Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz8wBXN5R4YRtm5e5r
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 168 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 3112504ef9193b2a877c7a38f6b03c9df9bc7a5b && git checkout 3112504ef9193b2a877c7a38f6b03c9df9bc7a5b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 32387500a601958826fe0b5ba72f53948c9dc5d2 dbc77fa981a585aad9a4d0ff1ccbc78fd259fb34 && git checkout -B drift-repro 32387500a601958826fe0b5ba72f53948c9dc5d2 && git merge --no-ff dbc77fa981a585aad9a4d0ff1ccbc78fd259fb34
node scripts/docs-audit/affected-docs.mjs --json 32387500a601958826fe0b5ba72f53948c9dc5d2
|
|
domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz Contract-review-claim: |
|
domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz Contract reviewServed-tier: Inputs: card #28163 (body, triage 6525913359 and 6527344285, claim 6528709142, os-dev-report 6531351334), PR body, the 3-file diff against merge base 3739d8d, the head's check-runs (read 2026-10-30T19:41Z: check-runs on dbc77fa: 54 total, 40 success (Auto Label, Build & E2E UI, Build Core, Build UI Deps, Check Changeset, Check PR Size, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint & Repo Gates, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · slot lookup & corpus, Lint · scoped · tooling self-tests, Live E2E UI, PR-body guards (claim · duplicate · Part-of · single-writer path), Plan Test Core shards, Spec property liveness, Test Core, Test Core (all 8), Test UI, Type Check UI, Type Check · consumer gates, Type Check · debt ledger, Type Check · source gates, Type Check · workspace, TypeScript Type Check, filter); 14 skipped path-filtered (18.x upgrade harness (opt-in), Auto Label, Build Docs, Check PR Size, Dogfood Regression Gate (matrix shard/3), Dogfood Verify CLI, Lint UI, Packed-tarball smoke (opt-in), Schedule gate · skip when a green push run covers the commit, Temporal Conformance (live PG + MySQL), Test UI (matrix shard/16), UI Published Artifacts); 0 failure, 0 in progress). Author ① Derived judgments
② Semver levelpatch. The published TODO notice shape is unchanged; one more detector reports under an id the migration chain already registers; no gate verdict moves (the doors refused this slot since #28150, the preview now says so). ③ Boundary flags
④ Design judgmentThe change holds against the code it cites and the invariant it restores. The header's rule, "a site is listed here exactly when that door refuses it", is met by construction rather than by a parallel list: one walk, the door's own call with the node, and the detector split keyed on the Implemented-by: VERDICT: PASS |
|
domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm 维护者速读
席位核对 · ACCEPT ·
|
Requested by Tesla · project thread
Fixes #28163
Clause-②: no
Metadata-protocol: none
维护者速读
os migrate meta --stored的“已存储但新版本会拒收”清单,现在会列出connector_action节点connectorConfig.input里带{…}旧模板记号的值,位置写成connectorConfig.input.KEY,归在connector-action-input-value-slot-judged这条升级条目下。registerFlow拒收这种流程,但迁移预览只看节点的config,看不到connectorConfig,运维升级前用这个工具查不到它,升级后流程直接不注册、不运行。config里的值照旧列在原条目下。回滚即 revert 本 PR。packages/spec/src/conversions/refused-shapes.ts(新的共用遍历forEachFlowValueSlotRefusal和新检测器connectorActionInputTemplateToken),packages/spec/src/conversions/refused-shapes.test.ts(migrate meta --stored does not list a stored connector_action whose connectorConfig.input carries a template token, though boot refuses it #28163 一节)。pnpm --filter @objectstack/spec exec vitest run src/conversions/refused-shapes.test.ts,预期 80 个测试全过,其中 “one TODO under the connector input entry, at connectorConfig.input.KEY” 通过。What changes
forEachFlowValueSlotRefusalwalks every node of every stored flow (region bodies included) and callsflowNodeValueTemplateRefusals(node.type, node.config, node). That is the callregisterFlow(flow-registration-checks.ts) andobjectstack validate(validate-expressions.ts) make, so the listing reads the same ledger, including theconnectorConfig · input.*entry fix(spec,service-automation,lint)!: registration and validate judge a connector_action's connectorConfig.input value slot #28150 added. No second list of node types or paths exists.flow-value-slot-template-dialect-refusedkeeps theconfigrefusals. Its path,fromand reason are unchanged.connector-action-input-value-slot-judgedtakes theconnectorConfigrefusals. It lists them atNODE_PATH.connectorConfig.input.KEY, with the judge's own message (the value's CEL spelling).idis the D3 entry of the retirement that refuses the shape (header ofrefused-shapes.ts, pinned bynames each refused shape by a D3 entry of its step). fix(spec,service-automation,lint)!: registration and validate judge a connector_action's connectorConfig.input value slot #28150 registered the connector-input refusal as its own D3 entry,connector-action-input-value-slot-judged. Theflow-value-slot-template-dialect-refusedentry's surface namesconfigonly, and its reason says "the template resolved a token CEL reads differently". For this slot that is false: the action was handed the token's text as written, as the fix(spec,service-automation,lint)!: registration and validate judge a connector_action's connectorConfig.input value slot #28150 entry says. So the row is listed under the entry that refuses it, with a reason that holds for it. Both detectors share the one walk and the one judge. The route is otherwise the order's.28163-stored-connector-input-listed.md:@objectstack/specpatch, both declaration lines.Tests
packages/spec/src/conversions/refused-shapes.test.ts, new#28163block:input: { text: '{record.name}', queue: 'support' }(throughapplyConversionsToStoredItem) gives one TODO:conversionIdconnector-action-input-value-slot-judged, pathflows[0].nodes[1].connectorConfig.input.text,fromthe token string, and a reason naming the flow, the node, the slot and the CEL envelope. The row is returned byte-identical.tags[1]) in a connector node inside a loop body is listed at...config.body.nodes[0].connectorConfig.input.tags[1].config.inputthat the D2 lift moves ontoconnectorConfigis listed at the lifted path. The listing judges the converted row, as boot does.inputare not listed.configfilter operand, oneconnectorConfiginput value), each under its own id.configplusFLOW_NODE_SIBLING_EXPRESSION_BLOCKSequals['config', 'connectorConfig'], so a new sibling block reds here until it has a detector.Ablation: removing the node argument turns the new cases red
node scripts/ablation-replace.mjs --file packages/spec/src/conversions/refused-shapes.ts --anchor 'flowNodeValueTemplateRefusals(typed.type, node.config, node)' --replacement 'flowNodeValueTemplateRefusals(typed.type, node.config)'. The anchor hit once (1 → 0, blob88279418→46343966). The suite went to Tests 4 failed | 76 passed (80): the stored-row case, the nested/region case, the lifted-loose case and the door-agreement case. The controls stayed green, as expected, since nothing is listed either way. The file was restored to its HEAD blob88279418withgit diff HEADempty. The test imports the module from source, so nodistrebuild is involved.Acceptance notes
connectorConfig.input, whichregisterFlowrefuses through the value-envelope judge. No refused-shape detector lists a malformed envelope in any value slot,configincluded. That is the existing scope ofREFUSED_STORED_SHAPES(template tokens), not something this PR widens. Noted for the seat, not filed.connector-action-input-value-slot-judgedentry's acceptance text names the bootwarnas the locator for a row that exists only insys_metadata. That stays true. The entry does not yet say thatos migrate meta --storedlists the row too. Editing it is outside this card's file surface, so it is left for the seat.Verification
All readings are on head
dbc77fa9: the fix commit2c3f9f50merged withorigin/mainat3739d8d6, afterpnpm install --frozen-lockfileand a fullpnpm exec turbo run build(Tasks 116 successful, 116 total).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 77 commands (the same 77 before and after the merge). All 77 were run with stdin from /dev/null and the exit code captured before any pipe: 77 exited 0. On the pre-merge head2c3f9f50, 73 exited 0 and 4 refused with exit 3 (PREREQUISITE NOT MET: no workspace build forcheck:dual-build-cjs-loads,check:lean-entry-closureandcheck:doc-formula-expressions, and a pinned fixture commit missing from the shallow clone forcheck-plugin-teardown-shape --self-test). After the build and a fetch of that commit, all four exit 0 ondbc77fa9.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE: "77 derived famil(ies) accounted for — 77 run, 0 NOT-MEASURED".pnpm --filter @objectstack/spec test(on2c3f9f50, under the verify lock): VERDICT command-exit 0, Tests 24007 passed, 1 todo (24008).pnpm --filter @objectstack/spec typecheck: exit 0.dbc77fa9:refused-shapes.test.ts+flow-value-slot-template.test.ts: Test Files 2 passed (2), Tests 253 passed (253).pnpm --filter @objectstack/spec check:generated: "All 14 generated artifacts are up to date".node scripts/check-dev-prereqs.mjs: exit 0.node scripts/check-nul-bytes.mjs: exit 0.!andClause-②carries no(narrowing)arm.Generated by Claude Code