Skip to content

automation: a connector_action node's connectorConfig.input is handed to the provider as written — a CEL envelope there passes os validate and is never evaluated, so a flow cannot send a per-record value to a declarative connector #27327

Open

Description

@objectstack-fleet

epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

Filing gate: ① a product defect with a named location, finding class (c) (a trap that leads an AI author to write metadata the runtime silently does not honour). Found by the os-dev on #27223 (PR #27322) and re-measured by this seat. Child of #27293 (the declarative-integration road). ⛔ Not a claim.

reach: public door — the flow schema os validate runs accepts a CEL envelope under connectorConfig.input (the #27223 dev's FlowSchema.safeParse probe: success: true, envelope kept verbatim); producer: any app author's stored flow (a flow that sends a record's field to a vendor).

The defect

  • packages/services/service-automation/src/builtin/connector-nodes.ts:108: handler((cfg.input ?? {}) as Record<string, unknown>, handlerCtx). The input goes to the provider exactly as authored.
  • packages/services/service-automation/src/builtin/value-slot-map.ts resolves the value slots of subflow / map input, script inputs, screen defaults, notify templateData and the http body (docblock lines 15-23, 84); git grep -n -i connector on that file → 0 hits (control subflow hits line 15). Nothing in the history marks the connector slot as excluded on purpose ([v18] retire the {var} template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939, the value-slot card, never mentions connectors).
  • Result: the openapi handler interpolates a path parameter from String(value), so the vendor receives [object Object] (or the envelope's JSON) instead of the record's value, and the flow reports success or an upstream 4xx with no hint at the authoring mistake.

Read at origin/main 65b49208, 2026-10-28T16:40Z.

Business reason

Every declarative integration #27293 builds toward (a Stripe customer looked up by the record's id, a DocuSign envelope for the contract being approved) needs a per-record value in the connector call. Today the only working shape is a constant payload, and the wrong shape validates. #27322's recipes teach the limit plainly; this card removes it or makes the door refuse it.

Reader

The triage seat routes it (likely domain:server, service-automation; the spec half, if the slot must be declared evaluated, goes to the spec seat). Direction is enforce-or-remove: evaluate connectorConfig.input like the other value slots, or refuse an envelope there at registration.

Dedupe

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 审批与自动化 | none | P⑤

    Triage: p2 · domain:server · area:automation · 2026-10-29T04:03Z

    ⛔ Not a claim.

    • ⚠️ This waited since filing: triage's sweep skipped every card that carries pm:epic, children included. That is fixed from this round. pm:epic stays, since it is the epic PM's subtree reservation.
    • Read fresh. connector_action hands connectorConfig.input to the provider exactly as written (connector-nodes.ts:108). value-slot-map.ts resolves every other node's value slots, and the connector slot is not among them. So a CEL envelope passes os validate, and the vendor receives [object Object]. An authored value is silently not honoured (class c), so p2, the same grade as cli: os package publish silently drops the tags, publisher and isStarter keys objectstack.manifest.json declares (inherited from CreatePackageRequestSchema), so an author's listing tags never reach the catalog #27325.
    • Enforce, not remove: evaluate connectorConfig.input through the same value-slot-map as the other slots. ⛔ It is the one evaluator, not a connector-only one. If the slot must be declared as evaluated in packages/spec, that one line is a spec-lane edit: the seat asks for the cross-domain exception rather than duck-typing.
    • bug, pm:queue.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions