Repository navigation
fix(service-automation): a connector_action evaluates a CEL envelope in connectorConfig.input - #27980
Conversation
…g.input as a value-slot map A CEL envelope at a top-level key of connectorConfig.input is evaluated in the run's scope through resolveValueSlotMap, the resolver every other value map uses; a literal is handed to the action's handler as a copy of what was written. Before, the map reached the handler as authored, so an envelope reading a record field arrived as the object it spells. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4czwdEVkNtLnwVK4j6Z
…lared slot evaluateValueEnvelope reaches Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4czwdEVkNtLnwVK4j6Z
📓 Docs Drift CheckThis PR changes 1 package(s): ⛔ 3 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 8 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 36d872f8acfa4eabd6d48605548563bf91f652cd && git checkout 36d872f8acfa4eabd6d48605548563bf91f652cd
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5f6dc96c396104350cfe71556ed724df5412bf54 1fa1f6c2e16f13db5624fb3500bab90ce52385a9 && git checkout -B drift-repro 5f6dc96c396104350cfe71556ed724df5412bf54 && git merge --no-ff 1fa1f6c2e16f13db5624fb3500bab90ce52385a9
node scripts/docs-audit/affected-docs.mjs --json 5f6dc96c396104350cfe71556ed724df5412bf54
|
|
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia Seat ACCEPT · PR #27980 · head
|
Requested by Elon · project thread
Fixes #27327
What changes
connector-nodes.ts: theconnector_actionexecutor resolvesconnectorConfig.inputthroughresolveValueSlotMap(the one per-key value-slot resolversubflow/mapinput,scriptinputs,screendefaultsandnotifytemplateDatause) before dispatch, and hands the handler the result. A top-level CEL envelope is evaluated in the run's scope; every other value is handed on as a copy of what was written. Resolved before thetry, so an envelope that faults fails the step withinput.<key>and its source, and the handler is never called.value-slot-map.ts: the docblock lists the new slot.engine.ts(comment only): theevaluateValueEnvelopedocblock no longer says only ledger-declared slots reach it; it namesconnectorConfig.inputas the one undeclared slot and points to automation: registration does not judge aconnector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968.connector-input-value-slot.test.ts; changeset (@objectstack/service-automationminor).Why
Before, the input map reached the handler as authored, so an envelope reading a record field arrived as the object
{ dialect: 'cel', source: '…' }and a declarative connector put[object Object]into the request. Triage ruling 6487582764: enforce through the same value-slot map, one evaluator, constant payloads unchanged.Acceptance notes
connector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968.registerFlowandobjectstack validatejudge value slots only through the spec ledgerFLOW_NODE_EXPRESSION_PATHS, whose paths point intonode.config;connectorConfigis a sibling block the ledger cannot address without apackages/specchange. Measured onregisterFlow:{ dialect: 'cel', source: 'rec.' }, atemplateenvelope and'{rec.id}'all REGISTER underconnectorConfig.input, while the same three undersubflowconfig.inputare REFUSED. Until automation: registration does not judge aconnector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968 lands there are two reject sets for this slot: a malformed envelope registers and fails the step at run time (with its source) instead of being refused at the door. Before this PR it was sent to the vendor verbatim. Seat ruling B; nopackages/specedit and no service-automation-only judge here.{token}string inconnectorConfig.inputstays a literal, as before (the refusal of the retired dialect rides the ledger too: automation: registration does not judge aconnector_actionnode'sconnectorConfig.inputvalue slot, because the spec expression ledger cannot address a sibling block ofconfig#27968).skills/still teach the old limit, and are left to a skills-lane edit (fable tier, outside this card's surface):skills/objectstack-automation/references/integration-recipes.md:18,skills/objectstack-automation/SKILL.md:88,skills/objectstack-automation/evals/integrations-declared.json:7. Nothing undercontent/docsstates it.Verification
main(handler receives the envelope objects); the constant-payload and no-input controls pass on both.scripts/ablation-replace.mjs, call site back tocfg.input ?? {}): 3 of 4 cells red (evaluated, copied, fault); restored.service-automation: 221 files / 2830 tests green after mergingmain(including fix(service-automation): a connector credential written through the door reaches every replica #27941);tsc --noEmitclean.dispatch-gates --ran: 62 derived families, 61 run green, 1 NOT MEASURED (check:dual-build-cjs-loads, exit 3, needs a whole-tree build);pnpm lintgreen.Clause-②: no
Metadata-protocol: semantic
Human Minimum
packages/specholds no runtime logic.pnpm lintpasses.main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed. (not touched)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4czwdEVkNtLnwVK4j6Z