Repository navigation
Description
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-esignwith DocuSign as the first provider (orconnector-docusignas the first member of an e-sign contract; the lane decides the split) — registering a provider factory underdocusignatinit()per ADR-0097 §2. - A closed action set:
create_envelope(document assys_filereference +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
ConnectorSchemaremain unimplemented (ADR-0097 §5), so the app'sapi-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-slack348 src lines,connector-rest431,connector-openapi822 (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 flowconnector_actionruns all three actions against the DocuSign developer sandbox; a hotclm contract goessigning → activewith 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
- 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.
- Whether
@objectstack/connector-openapiis 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
objectstack-fleet commentedon Oct 25, 2026
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.
domain:server(packages/connectors/;domain:servicesis 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.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 adomain:speccard first. A protocol change there goes to the maintainer.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
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:serverseat 2 ·os-project-manager·session_0186vfjHHMsRXC9EUT9hTFMoGenerated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Seat 1 record ·
domain:serverseat 1 ·os-project-manager·session_01R1q2xdtYgU6FKrZ7LgjPCC· 2026-10-27T04:11ZRe-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-maintainerstays, and no seat dispatches from it.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
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-esigncode plugin. DocuSign is a declarativeopenapiinstance inside the consuming app (HotCLM first, HotCRM second): the officialdocusign/OpenAPI-SpecificationseSignature 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 anincludeallowlist;authis 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'sapi-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 declarativeincludeplus 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 andincludelist as a reusable package, the callback payload mapping two apps share, the sandbox run that takes a HotCLM contractsigning → activewith the signed PDF attached (the acceptance stays), and a docs page. Triage decides whether that lands as adomain:devxrecipe (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-openapiships in the published runtime). Premise 2's answer now matters more: if the hosted runtime does not carry theopenapiprovider plugin, that is its own finding.pm:awaiting-maintainer→pm:blockedin the same stroke (the maintainer's action — this ruling — is done).Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
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: noconnector-esigncode plugin; DocuSign becomes a declarativeopenapiinstance 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:
includeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709 (and connectors: request-signing auth kind for the openapi and rest providers (RSA2 / HMAC canonical-request signers: Alipay, WeChat Pay, Aliyun, Tencent Cloud, e签宝) — the vendor-auth half that #26702 does not cover #26710 for the signature-authenticated regional providers e签宝 / 法大大 / 契约锁);includelist, callback mapping, the OAuth "not yet" entry): skills: integrations are declared, not coded — teach the declarative-connector-first rule, the per-archetype recipes and the credential hand-off in objectstack-automation, with an eval that refuses the "write a DocuSign plugin" answer #27223's integration recipes, and the marketplace handbook docs: a marketplace handbook for app authors — listing metadata, README conventions,os package publish --submit, review, the customer install experience (credentials, sample data, upgrade, uninstall) and staying current with platform versions #27240;signing → activewith the signed PDF attached, against the DocuSign developer sandbox): HotCLM's own F8 card in objectstack-ai/hotclm, which consumes the platform pieces above; the sandbox credential stays the maintainer's to provide there;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: #26702line in the re-scope comment is void with this closure.pm:blockedleaves in the same stroke.Closed by
session_01J8VVAjRKqdoEYQ4hXxtBufon the maintainer's instruction.Generated by Claude Code