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

Closed

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

  2. added
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 29, 2026
  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    Retriage ask (label hygiene), 2026-10-30T04:05Z: this card carries both pm:epic and pm:queue. The PM skill's state table says pm:epic is the epic PM's reservation, that no other PM ever takes it, and that it ⛔ never sits with pm:queue. Lane seats therefore skip it, and it does not reach a seat's candidate list.

    Ask: pick one state. Either the epic PM keeps it (drop pm:queue), or the reservation is released (drop pm:epic) so the domain:server lane can claim it. pm:retriage added; no other label touched.

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: label hygiene · pm:epic reservation released · 2026-10-30T04:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  5. added and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 30, 2026
  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    Claim: PM loop round 2 · 2026-10-30T05:29Z
    Session: session_016WV4czwdEVkNtLnwVK4j6Z (card thread; seat session_016WV4czuTWNgKR22fKv7jia)
    Account: os-elon-musk
    Branch: claude/project-thread-6gm2er (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
    Worktree: objectstack-issue-27327
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/services/service-automation/src/builtin/value-slot-map.ts (add the connector_action connectorConfig.input slot), packages/services/service-automation/src/builtin/connector-nodes.ts (call site), the evaluateValueEnvelope docblock in packages/services/service-automation/src/engine.ts (comment only, naming the connector slot and the registration gap #27968; amended by the seat), tests under packages/services/service-automation/src/, .changeset/*. A packages/spec line is ⛔ out of surface: if the slot must be declared there, stop and report, and the seat asks for the cross-domain exception.
    Container & model: M, mode:thread, model: opus (TIER_DEFAULT), effort: high
    Clause-②: no
    Metadata-protocol: semantic (an authored CEL envelope under connectorConfig.input is now evaluated instead of passed verbatim; confirmed by the dev from the diff). Registration half split to #27968 (spec ledger, cross-domain), seat ruling option B.
    Responsibility: flow value-slot evaluation in service-automation for the connector_action node.
    Thread-read: 6515359975
    Premise: holds (triage 6487582764 read it fresh: connector-nodes.ts:108 passes cfg.input verbatim; the dev measures first)
    Serial constraints cleared: no open PR touches value-slot-map.ts or connector-nodes.ts at claim time; draft #27819 edits service-automation/src/plugin.ts, outside this surface.

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czwdEVkNtLnwVK4j6Z
    os-dev-report

    {
      "card": 27327,
      "pr": 27980,
      "head": "1fa1f6c2",
      "verdict": "done",
      "scope": "executor half (seat ruling B); registration half filed as #27968",
      "gates": {
        "derived": 62,
        "ran": 61,
        "green": 61,
        "not_measured": ["pnpm check:dual-build-cjs-loads (exit 3, needs a whole-tree build)"],
        "red": [],
        "extra": ["pnpm lint: exit 0", "service-automation vitest: 221 files / 2830 tests green after merging main (incl. #27941)", "tsc --noEmit: clean"],
        "reconcile": "dispatch-gates --ran: 62 derived accounted, 61 run, 1 NOT-MEASURED"
      },
      "measure_first": "connector-input-value-slot.test.ts red on main bacb3e6a (handler received the envelope objects); constant-payload and no-input controls green on both",
      "ablation": "scripts/ablation-replace.mjs, call site back to `cfg.input ?? {}`: 3 of 4 cells red (evaluated, copied, fault); restored, tree clean",
      "line_budget": { "changed_lines": 171, "threshold": 3000, "files": 5 },
      "files_changed": [
        ".changeset/27327-connector-action-input-value-slot.md",
        "packages/services/service-automation/src/builtin/connector-input-value-slot.test.ts",
        "packages/services/service-automation/src/builtin/connector-nodes.ts",
        "packages/services/service-automation/src/builtin/value-slot-map.ts",
        "packages/services/service-automation/src/engine.ts (comment only, amended surface)"
      ],
      "declarations": { "clause_2": "no", "metadata_protocol": "semantic", "bump": "minor" },
      "deviations": [
        "Stopped once for a seat call: the registration half needs a packages/spec ledger change (connectorConfig is a sibling block FLOW_NODE_EXPRESSION_PATHS cannot address). Seat ruled B; claim amended to add the engine.ts docblock.",
        "Skills-docs not edited (outside surface, fable tier): skills/objectstack-automation/references/integration-recipes.md:18, skills/objectstack-automation/SKILL.md:88, skills/objectstack-automation/evals/integrations-declared.json:7 still say connectorConfig.input is sent as written."
      ],
      "dogfood_battery": "not owed (no narrowing)",
      "writes": 3,
      "mcp_calls": { "reads": 2, "writes": 0 }
    }
  8. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    ACCEPT → PR #27980 comment 6516529921 · 2026-10-30T06:31Z · ready + auto-merge armed through the relay. Registration half stays open as #27968; skills texts as #27982.

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions