Repository navigation
docs(adr): ADR-0143 — outbound connector auth is open tier: OAuth2 grants, vendor app-credential exchange and request signing in one declarative auth contract - #26833
Conversation
…ants, vendor app-credential exchange, request signing) Draft (Proposed) successor record moving outbound connector auth into the open tier on the maintainer's ruling, with the four maintainer decisions stated as open questions with options and a recommendation. Dated, append-only amendment notes on ADR-0015 (attribution only), ADR-0022, ADR-0023, ADR-0024 and ADR-0097; the generated docs/adr/README.md index. Claude-Session: https://claude.ai/code/session_01ADHkmP2wqmTYar443bTqhK Co-authored-by: Claude <noreply@anthropic.com>
check:adr-symbol-anchors refuses a path:line citation in docs/adr/**; every code citation is now path#symbol (or file-level where the cited spot has no declaration), so the gate keeps each one checked. Claude-Session: https://claude.ai/code/session_01ADHkmP2wqmTYar443bTqhK Co-authored-by: Claude <noreply@anthropic.com>
ADR-0018's "Out of scope" paragraph is where OAuth2 token refresh was first placed in the enterprise tier for connectors. It now carries the same dated, append-only note as the other five, and ADR-0143 lists it under Amends instead of as an owed follow-up. Claude-Session: https://claude.ai/code/session_01ADHkmP2wqmTYar443bTqhK Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
After ADR-0018 joined, the record lands six amendment notes, and five records (not six) place OAuth2 refresh in the enterprise tier. Claude-Session: https://claude.ai/code/session_01ADHkmP2wqmTYar443bTqhK Co-authored-by: Claude <noreply@anthropic.com>
Requested by Steve · project thread
Refs #26768
Clause-②: no
Metadata-protocol: none
维护者速读
signed(封闭方案枚举);并在 ADR-0015/0018/0022/0023/0024/0097 追加带日期的修订注记(只追加,不改写原文),重新生成 ADR 索引。docs/adr/0143-outbound-connector-auth-is-open-tier.md的「Decisions put to the maintainer」四问(Q1 连接归属与执行身份、Q2 存储复用 better-auth account 还是独立连接对象、Q3 首批产品、Q4 首批签名方案);② 同文件 D1(哪些从企业版移出、哪些不动);③docs/adr/0097-declarative-connector-instances.md两条注记。pnpm check:adr-symbol-anchors && pnpm check:adr-index,预期两条都 0 退出、无 0143 相关告警。What changes
docs/adr/0143-outbound-connector-auth-is-open-tier.md(Proposed). It decides, in one record:oauth2(authorization_codewith mandatory S256 PKCE and refresh,client_credentials, MCP authorization discovery),app-credential(feishu/dingtalk/wecom) andsigned(a closed scheme enum; a member enters only with its signer and vendor vectors).credentialRef, and tokens live in an encrypted connection record, never in metadata.ConnectorOAuth2Schemagoes to the spec slice under ADR-0087.sys_accountdoes not fit), Q3 first products (rec. HubSpot MCP, Feishu, Alipay v3 sandbox), Q4 first signing schemes (rec.alipay-rsa2,aliyun-acs3-hmac-sha256,tencentcloud-tc3-hmac-sha256).**Amended by**:header line and a blockquote; no existing line changes):sys_channel_accountlifecycle does not.docs/adr/README.md, regenerated bynode scripts/adr-index.mjs(one new row and the summary counts).Tests
Docs-only diff; no package touched, so no build closure, unit test or typecheck is owed. The derived ADR gate family ran on the final head (see Verification).
Acceptance notes
origin/mainat0ea90c7a.git grep -n "deliberately omits OAuth2" origin/main -- docs/adr/0097-declarative-connector-instances.mdmatches line 119: "The open tier deliberately omits OAuth2 fromConnectorInstanceAuthSchema."git grep -n "intentionally absent" origin/main -- packages/spec/src/shared/connector-auth.zod.tsanswers nothing, but the sentence is still in the file: it wraps across lines 113-114 ("OAuth2 is intentionally" / "absent (enterprise tier, ADR-0015)."). A one-line grep cannot match it. The ADR says so and names which surface each schema serves:ConnectorOAuth2Schema(L30-40, inside the runtime unionConnectorAuthConfigSchemaL79-85) vsConnectorInstanceAuthSchema(L158-163, authored, four static kinds).0ea90c7a). The ADR itself citespath#symbol, becausecheck:adr-symbol-anchorsrefuses line anchors indocs/adr/**.connector-auth.zod.ts: L35 and L38 inlineclientSecret/refreshToken; L99-102ResolvedConnectorAuth.credential-resolver.ts: L12, L21-22.service-automation/src/plugin.ts: L1955 resolver pick, L1997 resolve at materialization, L2306-2337resolveInstanceAuth(static kinds only).connector-mcp/src/mcp-provider.ts: L63-79applyAuthToHeaders, L115.connector-openapi/src/openapi-connector.ts: L52 and L88-93 (securitySchemestyped, never read), L365applyAuth.connector-rest/src/rest-connector.ts: L89.integration/connector.zod.ts: L1168-1192DeclarativeConnectorEntrySchema(inline-secret refusal).sys-account.object.ts: L183-187 (user_idrequired), L236-255 (token columnstextarea+internal, notsecret).auth-schema-config.ts: L124AUTH_ACCOUNT_CONFIG.auth-plugin.ts: L557socialProviders.auth-manager-plugin-list.ts: L478-488 (oauth-provider).connector-imap/src/account.ts: L60, L68-69 (MailCredentialProvider).grep -c -i enterprise= 0). The enterprise placement was first drawn for connectors by ADR-0018 line 229, then repeated by 0022, 0023, 0024 and 0097. The ADR-0015 note therefore corrects the attribution and changes no decision.## Provenancepointer. This lane cannot reach the cloud repository. ADR-0143's Provenance section records that the boundary was only ever drawn in this repository (nocloud ADRcitation in any of the six records) and that the cloud record is owed.GOVERNED_APPROVERS. The seat does not ready it, arm auto-merge or enqueue it.Verification
Derived gate family, final head 6948496: 21/21 exit 0, --ran reconciles 21/21, 0 NOT-MEASURED (derived zero)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths): 8 paths, 440 changed lines (under the 3000 threshold), 21 commands. Each one ran on69484961, with exit codes captured before any pipe:--ran(each linecommand :: exit N): "21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3)".First-pass history:
a8384e3b,check:adr-symbol-anchorswas red with 24[line-anchor]findings in ADR-0143. They were fixed inc965eb87by moving topath#symbol.69484961adds the ADR-0018 note (seat review round 1); the same 21 commands re-ran there, all exit 0.check:doc-formula-expressionsfirst exited 3 (prerequisite not met, nothing measured). It went green afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunderos-verify-lock.sh(VERDICT command-exit 0).Generated by Claude Code