Skip to content

Electronic-signature connector family: connector-esign with DocuSign first, three fixed actions, consumed by apps as a declarative provider: 'docusign' instance #25747

Closed as not planned

Description

@zhuangjianguo

Filing class: ③ maintainer-directed task. The hotclm maintainer, 2026-10-25, verbatim: 「本项目是元数据应用,平台相关的功能应该在平台开发」, and ruled letter A on objectstack-ai/hotclm#83 (「同意」, decision batch #1 item 1, 2026-10-25T05:02Z) — option A of that card is this card.

Reader: objectstack triage → the domain:services lane that owns packages/connectors/. Priority: inherits the ruled card's milestone (hotclm M4) per the app-repo rule 「应用仓裁决立出的平台卡取被裁卡优先级,不降档」; triage sets the label.

Business reason

hotclm F8 (DESIGN.md §06 F8, §08) needs electronic signature: 「发起签署」 posts the current clean version and the signers to a provider; the provider's callback maps envelope status to the contract, creates the final_signed version and stamps signed_at. HotCRM is the second consumer (quotes and contracts). The platform deliberately builds no e-sign engine (spec 17 removed it) — this is integration only.

Today the only shipped path is a declarative instance over a generic provider (provider: 'openapi' | 'rest' | 'mcp', ADR-0097). Each app would then re-derive "envelope → contract" semantics from DocuSign's several hundred OpenAPI operations, and every regional provider (契约锁 / 法大大 / e签宝) would be configured per app. A platform connector fixes the contract once, and an app that declares provider: 'docusign' without the plugin fails loudly at boot (ADR-0097 §2) instead of mis-calling an API at runtime.

What

  • A new package under packages/connectors/ — connector-esign with DocuSign as the first provider (or connector-docusign as the first member of an e-sign contract; the lane decides the split) — registering a provider factory under docusign at init() per ADR-0097 §2.
  • A closed action set: create_envelope (document as sys_file reference + signers[] with side/order/email), get_envelope_status, download_signed_document. Nothing else is authored on the instance (ADR-0097 §5).
  • Credentials are references only (credentialRef, ADR-0097 §3). Static credential path open-source; managed OAuth refresh on the enterprise line (ADR-0015, ADR-0022 §4).
  • Inbound callback stays outside the connector: webhooks/triggers on ConnectorSchema remain unimplemented (ADR-0097 §5), so the app's api-triggered flow receives it. This card documents the callback payload the app flow maps, so two apps map it the same way.
  • Precedent and size: connector-slack 348 src lines, connector-rest 431, connector-openapi 822 (tests excluded), all in this monorepo. Independent plugin distribution (ADR-0025 .osplugin / os plugin install) is not implemented, so the monorepo is the only runnable home for now.

Acceptance

  • An app declares, as pure metadata, connectors: [{ name: 'esign', type: 'api', provider: 'docusign', auth: { …, credentialRef: 'docusign_sandbox' } }]; a flow connector_action runs all three actions against the DocuSign developer sandbox; a hotclm contract goes signing → active with the signed PDF attached (hotclm card 12's acceptance, unchanged).
  • Declared provider: 'docusign' with the plugin absent ⇒ boot fails naming the entry, the provider and the plugin that supplies it.
  • A docs page under content/docs/ and a release-note line.

Premises the lane re-checks at dispatch

  1. A DocuSign developer sandbox credential is reachable from the dev container — the maintainer provides it on this repo's side (part of the hotclm#83 ruling). Without it the acceptance cannot run; ⛔ not faked, not gate-only.
  2. Whether @objectstack/connector-openapi is in the published 18.1.0 — if yes, hotclm may prototype its callback flow over it meanwhile; that is not the terminal shape.

Dedupe

search_issues on this repo, 2026-10-25: "e-signature connector DocuSign esign envelope signed document" → 0 hits; "electronic signature connector plugin DocuSign envelope e-sign provider" → 0 hits. Nearest kin: ADR-0022 (connector-slack routing), ADR-0097 (declarative instances), ADR-0025 (distribution, unimplemented).

Related

objectstack-ai/hotclm#83 (the ruling) · hotclm DESIGN.md §06 F8, §08, §10 row Signature · objectstack-ai/hotclm#38 (clm_signature.envelope_id gains its consumer with F8).

Activity

  1. added
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    domain:serverDomain lane — seat card indexed by label:pm:seat
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    on Oct 25, 2026
  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — enhancement · priority:p2 · domain:server · area:api · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T05:55Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • Lane: domain:server (packages/connectors/; domain:services is now its alias). p2: the ruled hotclm card's milestone is M4, and this card does not lower it. If hotclm's card is p1, say so here and triage raises it.
    • Scope check before the claim: a new connector package under ADR-0097 (factory registration, closed action set, credentialRef) adds no spec key. If the dev finds it needs one (for example a provider enum entry, or a callback payload shape in spec), that half is filed as a domain:spec card first. A protocol change there goes to the maintainer.
    • A new published package joins the fixed release group, and its changeset says so.

    Generated by Claude Code

  3. added
    pm:awaiting-maintainerAwaiting a manual maintainer action — ruling already given; no dispatch, no machine exit
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 26, 2026
  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Seat 2 record · 2026-10-26T15:05Z
    Ruled: 「这个改维护者处理」 (the maintainer, verbatim) — this card moves to the maintainer and leaves the server lane's dispatch queue.
    Maintainer-action: the maintainer handles #25747 (including the DocuSign developer sandbox credential its acceptance needs, premise 1) — done when the maintainer records on this card that the lane may dispatch it, or closes it.

    Context: the maintainer gave that ruling at 2026-10-26T15:04Z. Seat 2 put the card to the maintainer because its acceptance must run against a DocuSign developer sandbox (not faked, not gate-only) and no sandbox credential is reachable from the dev containers. The card is pm:awaiting-maintainer: not dispatched, not chased. · domain:server seat 2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Seat 1 record · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-27T04:11Z

    Re-confirmed: 「25747 转维护者」 (the maintainer, verbatim, 2026-10-27T04:08:44Z). The ruling 6419423580 (「这个改维护者处理」, 2026-10-26) stands unchanged: the maintainer handles this card, pm:awaiting-maintainer stays, and no seat dispatches from it.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #26702

    Re-scoped by maintainer ruling · 2026-10-28T12:26Z

    Maintainer ruling (objectstack session session_01J8VVAjRKqdoEYQ4hXxtBuf, 2026-10-28, verbatim, not translated): 「25747 按照新的决策改,而且是不是就不需要这个插件了。」 — given after the rulings on #27230 (letter A: credentials are supplied by the customer's administrator through a platform credentials object, #27237 / #27238) and the maintainer's earlier line 「所以应该先处理 A/B 吧,并且要有 skills或者文档指导元数据开发者。前面agent还在建议我开发 DocuSign」 (#27223).

    What changes. No connector-esign code plugin. DocuSign is a declarative openapi instance inside the consuming app (HotCLM first, HotCRM second): the official docusign/OpenAPI-Specifications eSignature document (MIT, Swagger 2.0), normalized offline to 3.x JSON and trimmed to the three operations this card named — create envelope, get envelope status, download the signed document — packaged with the app with an include allowlist; auth is the OAuth variant #26702 adds (DocuSign authorizes by JWT grant / authorization code — a static key does not reach it); the inbound Connect callback is the app's api-triggered flow, as this card already said. The "fixed three-action contract across providers" that justified a plugin is deferred by name: it is a product choice, not a technical necessity, and is re-opened only when a second provider (e签宝 / 法大大 / 契约锁, which wait on request signing, #26710) is actually declared by an app.

    Why this card is blocked rather than closed. The declarative shape needs two platform pieces that do not exist at c3fb185a: the OAuth auth variant and per-dispatch token refresh (#26702), and the declarative include plus offline normalization of a Swagger 2.0 document (#26709). When #26702 lands, this card's remaining deliverable is a documented, verified recipe, not code: the normalized DocuSign document and include list as a reusable package, the callback payload mapping two apps share, the sandbox run that takes a HotCLM contract signing → active with the signed PDF attached (the acceptance stays), and a docs page. Triage decides whether that lands as a domain:devx recipe (the natural home, alongside #27223's integration recipes) or stays on this card re-labelled; the title above still names the plugin and reads as superseded by this comment.

    Premises the lane re-checks at dispatch stay as written (a DocuSign developer sandbox credential provided by the maintainer; whether @objectstack/connector-openapi ships in the published runtime). Premise 2's answer now matters more: if the hosted runtime does not carry the openapi provider plugin, that is its own finding.

    pm:awaiting-maintainer → pm:blocked in the same stroke (the maintainer's action — this ruling — is done).


    Generated by Claude Code

  7. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    pm:awaiting-maintainerAwaiting a manual maintainer action — ruling already given; no dispatch, no machine exit
    on Oct 28, 2026
  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Ruled: closed as not planned · 2026-10-28T12:32Z

    Maintainer ruling (objectstack session session_01J8VVAjRKqdoEYQ4hXxtBuf, 2026-10-28, verbatim, not translated): 「25747 按照新的决策改,而且是不是就不需要这个插件了。」 then 「25747 不需要了不是应该关卡吗」. The re-scope comment above (posted earlier today) stands as the record of why: no connector-esign code plugin; DocuSign becomes a declarative openapi instance inside the consuming app once #26702 (OAuth) and #26709 (include + offline normalization of the Swagger 2.0 document) land.

    Where the remaining pieces live, so nothing is lost by closing:

    An open pull request in a sibling repository cross-references this card (timeline shows #120 of that repository, read only as a cross-reference here); it is not affected by this closure, and its author should point it at #26702 / #26709 instead of this card. The Blocked-by: #26702 line in the re-scope comment is void with this closure. pm:blocked leaves in the same stroke.

    Closed by session_01J8VVAjRKqdoEYQ4hXxtBuf on the maintainer's instruction.


    Generated by Claude Code

  9. removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsdomain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions