Repository navigation
Description
Unblocked (triage, 2026-10-30): ADR-0143 is Accepted on main (PR #27231); #26768's only open item is the cloud mirror record (objectstack-ai/cloud#3350), which gates no code in this repo.
Filing gate ③ (maintainer-directed task). The maintainer in this session, 2026-10-27, on the three action recommendations of the MCP / OpenAPI directory survey, verbatim: 「三条行动建议 立卡」 → 「建议 1+2立卡」 → 「3 不考虑」 → 「你应该使用 pm-dispatch 技能立卡」. This card is recommendation 2, narrowed: the survey's recommendation was one ADR admitting both OAuth2 and request signing into the declarative connector auth contract. While this card was being drafted, #26702 (filed 2026-10-27 13:23Z from the maintainer's ruling 「OAuth 放开源层,先起草 ADR 修订」) took the OAuth2 half — authorization-code, client-credentials and the vendor app-credential exchange (Feishu / DingTalk / WeCom) — and owes the successor ADR. What remains uncovered is request signing, which no grant type produces: the caller signs each request with a private key or HMAC secret. This card is that half.
Filed by session_01J8VVAjRKqdoEYQ4hXxtBuf. ⛔ Not a claim. Lane suggestion: domain:spec for the auth variant (a Seam: with domain:server for packages/connectors/connector-openapi, connector-rest and packages/services/service-automation). Triage sets labels and priority. Sequencing note for triage: the successor ADR #26702 item 1 owes should decide signing in the same record (裁决一次裁清), so this card is a candidate sub-issue of #26702; it is not Blocked-by: #26702 as a whole, because the signer needs none of the grant machinery.
Business reason. The Chinese payment, cloud and e-signature platforms the marketplace's China lane needs do not use OAuth or static keys on their APIs; they sign every request:
| Platform | Scheme (official docs) | Machine-readable spec |
|---|---|---|
| Alipay OpenAPI v3 | RSA2 (SHA256withRSA) over a canonical request | yes, OpenAPI 3.0.3 YAML (alipay/alipay-sdk-java-all v3/api/openapi.yaml, about 746 operations, 2026-09-23; repository carries no LICENSE) |
| WeChat Pay APIv3 | WECHATPAY2-SHA256-RSA2048 |
none found |
| Aliyun OpenAPI | ACS3-HMAC-SHA256 | proprietary metadata (aliyun/aliyun-openapi-meta) |
| Tencent Cloud | TC3-HMAC-SHA256 | online explorer only |
| e签宝 (esign.cn) | request signature or OAuth2 | none found |
| AWS (for the global shelf) | SigV4 | Smithy models, not OAS |
Without a signing auth kind, none of these is reachable from a declarative instance, whatever OAuth2 support lands; a flow that needs to create an Alipay trade or a Tencent Cloud resource cannot be authored as metadata. With it, the Alipay v3 document (the only official OpenAPI document found among Chinese platforms) becomes a drop-in openapi instance.
Who acts. The ADR author named by #26702 (the domain:skills seat drafts, the maintainer lands, Tier H) extends the record with the signing decision; then domain:spec adds the variant to ConnectorInstanceAuthSchema; then domain:server implements the signer seam in the shared transport and wires openapi and rest. Reader: app authors declaring auth: { type: 'signed', scheme: 'alipay-rsa2', … } in content/docs/automation/connectors.
Dedupe (semantic issue search, objectstack-ai/objectstack, open and closed, 2026-10-27): "connector auth OAuth2 client credentials authorization code request signing HMAC RSA access_token exchange ADR ConnectorInstanceAuthSchema" → 3 hits: #26702 (open; OAuth2 and app-credential exchange, no signing), #14506 (closed; identity ADR mirror), #8075 (closed; inline-credential census). No card covers request signing.
Governing text
packages/spec/src/shared/connector-auth.zod.ts:113-114(header of the declarative auth block): "OAuth2 is intentionally absent (enterprise tier, ADR-0015)." The declared kinds arenone | bearer | api-key | basic(lines 119–145). Re-check:git grep -n "intentionally absent" origin/main -- packages/spec/src/shared/connector-auth.zod.ts.- ADR-0097 line 119: "The open tier deliberately omits OAuth2 from
ConnectorInstanceAuthSchema" and §3:credentialRefresolves at materialization; inline secrets are refused at publish. Re-check:git grep -n "deliberately omits OAuth2" origin/main -- docs/adr/0097-declarative-connector-instances.md. - AGENTS.md Prime Directive [WIP] Add Chinese version of the documentation #13: an accepted ADR binds until a superseding ADR says otherwise — the auth boundary moves by ADR, which connectors: outbound OAuth in the open tier — connection-scoped authorization-code / client-credentials / app-credential tokens, refreshed per dispatch, for the openapi, mcp and rest providers #26702 item 1 already owes; this card adds the signing decision to that record rather than opening a second one.
- AGENTS.md Prime Directive Add comprehensive test suite for Zod schema validation #12: contract-first; the variant is a closed enum of named schemes, refused at publish when unknown — never a free-form "custom header function".
Protocol statement. Metadata-protocol: added: a new ConnectorInstanceAuthSchema variant. Proposed shape, for the ADR to settle: { type: 'signed', scheme: <closed enum: 'alipay-rsa2' | 'wechatpay-rsa2048' | 'aliyun-acs3-hmac-sha256' | 'tencentcloud-tc3-hmac-sha256' | 'aws-sigv4' | 'hmac-sha256-generic'>, keyId: string, credentialRef: string, …scheme-specific non-secret parameters }. The private key or HMAC secret is a credentialRef only (ADR-0097 §3). Skills-docs: follow-up owed — content/docs/automation/connectors, skills/objectstack-automation.
Premises (each with a re-check; read at c3fb185a)
- No signing kind exists in either the declarative or the runtime auth union. Re-check:
git grep -n "z.literal('" origin/main -- packages/spec/src/shared/connector-auth.zod.ts(expected: oauth2, api-key, basic, bearer, none only). - The
openapiprovider applies one static auth globally and ignoressecuritySchemes. Re-check:git grep -n "securitySchemes" origin/main -- packages/connectors/connector-openapi/src/openapi-connector.ts(type only, no consumer). - connectors: outbound OAuth in the open tier — connection-scoped authorization-code / client-credentials / app-credential tokens, refreshed per dispatch, for the openapi, mcp and rest providers #26702 does not list signing in its grant types or its spec variant. Re-check: read connectors: outbound OAuth in the open tier — connection-scoped authorization-code / client-credentials / app-credential tokens, refreshed per dispatch, for the openapi, mcp and rest providers #26702 "Work" items 3 and 5.
Work
- ADR (with connectors: outbound OAuth in the open tier — connection-scoped authorization-code / client-credentials / app-credential tokens, refreshed per dispatch, for the openapi, mcp and rest providers #26702 item 1): admit a
signedauth kind with a closed scheme enum into the open tier; state which schemes ship first and that the secret is always acredentialRef. - Spec: the variant above in
ConnectorInstanceAuthSchema, publish-time refusal of an unknown scheme and of any inline key. - Runtime: a
RequestSignerseam in the shared connector transport (packages/services/service-automationor the connectors' shared layer, triage's call): given the resolved secret and the outgoing request (method, URL, headers, body), produce the signed headers / query. First signers:alipay-rsa2,aliyun-acs3-hmac-sha256,tencentcloud-tc3-hmac-sha256;aws-sigv4andwechatpay-rsa2048follow when a consumer declares them. Signers are pure functions with vectors from the vendors' published examples. - Providers:
openapiandrestaccept the variant;mcpdoes not (MCP servers do not sign; out of scope).
Acceptance
- A declarative
openapiinstance over the normalized Alipay v3 document (see connectors: auto-shelf readiness — declarativeincludeand 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's normalization tool) withauth: { type: 'signed', scheme: 'alipay-rsa2', keyId, credentialRef }dispatches a sandbox query end to end; the request carries the AlipayAuthorizationheader computed by the signer; the private key appears nowhere insys_metadata, inGET /api/v1/automation/connectors, or in logs. - Signer unit tests reproduce the vendors' published signature examples byte for byte for each shipped scheme.
- An unknown
schemeor an inline key is refused at publish with a located error; changeset per touched package.
Out of scope
- OAuth2 grants and app-credential (
appKey/secret → access_token) exchange: connectors: outbound OAuth in the open tier — connection-scoped authorization-code / client-credentials / app-credential tokens, refreshed per dispatch, for the openapi, mcp and rest providers #26702. - Writing OpenAPI documents for WeChat Pay, WeCom, e签宝 where the vendor publishes none: recommendation 3, not filed (「3 不考虑」).
Related
#26702 (parent candidate) · ADR-0097 · ADR-0015 · ADR-0023 · #26709 (recommendation 1, same batch).
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Retriage ask (label hygiene), 2026-10-30T04:07Z: this card carries both
pm:epicandpm:queue. The PM skill's state table sayspm:epicis the epic PM's reservation, that no other PM ever takes it, and that it ⛔ never sits withpm: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 (droppm:epic) so thedomain:serverlane can claim it.pm:retriageadded; no other label touched.objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: label hygiene ·
pm:epicreservation released · 2026-10-30T04:59Z⛔ Not a claim.
pm:epicandpm:queuenever sit together. Its epic PM (parent [Epic] Marketplace and connector auto-shelf — E1 platform prerequisites (openapi/mcp hardening, outbound OAuth, request signing), E2 administrator credential hand-off, E3 author recipes and handbook, E4 the first shelf of official connector apps #27293) has had no own output on this card for more than a day (last at 2026-10-28 15:16Z), so under seat-lifecycle the reservation is released and the card goes to the lane. But it is not claimable: its body carriesBlocked-by: #26768, and that card (cloud, ADR) is open andpm:blocked. Sopm:epicandpm:queueare dropped andpm:blockedis set.pm:retriageremoved.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 可对外的 API | none | P②
Triage: unblocked · p1 ·
domain:server·pm:queue· 2026-10-30T12:28Z⛔ Not a claim. Correction, and triage's miss: in R761 triage set
pm:blockedon the body lineBlocked-by: #26768without reading what #26768 still owed.main, by PR docs(adr): ADR-0143 accepted — the maintainer's Q1–Q4 decisions recorded; D2.1, D2.3, D3, D4 and D7 state what they settle #27231 on 2026-10-28.pm:queueat p1 for thedomain:serverlane.security. A contract review is owed before approval. [Decision] Ontology over external systems: virtual objects on ADR-0015 federation — two driver tiers (plugin code · declarative OpenAPI), pushdown/identity/catalog/cache rules, Studio and AI drafts (2026 ontology research + deep design) #27261 D7 already lets external datasources borrow connector credentials, so this unlocks OAuth-backed systems (OData, Salesforce).Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Claim: PM loop round 2 · 2026-10-30T22:50Z
Session:
session_016WV4cxRP1AqTeP2PWAhwGK(card thread; seatsession_016WV4czuTWNgKR22fKv7jia)Account:
os-elon-muskBranch:
claude/project-thread-tpb1yk(the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)Worktree:
objectstack-issue-26710Domain:
domain:serverSeat:
domain:server#3File surface: amended from the thread's slice plan (S1,
/mntplan read by the seat). Spec seam (domain:specpaths carried as Seam):packages/spec/src/shared/connector-auth.zod.ts(thesignedvariant),packages/spec/src/integration/connector-provider.ts(ConnectorRequestSigner,ConnectorProviderContext.requestSigner, the materialization acknowledgement),packages/spec/src/integration/connector.zod.ts(re-exports;signedonprovider: mcprefused),packages/spec/src/integration/connector-fetch-policy.ts(per-attempt signing wrap, shared response reader); their tests andtype-alias-convention.pin.test.ts; generated artefacts by repo tooling only (packages/spec/{api-surface,authorable-surface,declaration-map,export-origins,json-schema.manifest}/integration.json,packages/spec/variant-docs.json,content/docs/references/**, the unknown-key strictness ledger counts,packages/spec/liveness/connector.jsonif asked);packages/spec/docs/SYNC_ARCHITECTURE.md. Server:packages/services/service-automation/src/request-signing/**(new; exhaustive scheme switch),service-automation/src/plugin.ts(reconcile builds the signer, fails closed without the acknowledgement),connector-credential-source.ts(lendRefusal) andconnector-materialization.test.ts;packages/connectors/connector-openapi/src/{openapi-connector,openapi-provider}.tsandpackages/connectors/connector-rest/src/{rest-connector,rest-provider}.tswith tests;packages/qa/downstream-contract/src/additional-domains.fixtures.tsif the fixture walk asks;scripts/adr-anchors/*.json(new ADR-0143 anchors);content/docs/automation/connectors.mdx;.changeset/*. Not touched:resilient-fetch.ts,connector-mcp, inbound auth, OAuth2 grant machinery (#26702),skills/**. Later slices (S2tencentcloud-tc3-hmac-sha256, S3alipay-v3+ response verification) add their signer files under the same folders.Container & model:
L,mode:thread,model: opus (TIER_DEFAULT),effort: xhigh(p1, security)Clause-②: yes (a new auth variant on a published schema)
Metadata-protocol: added (a new
ConnectorInstanceAuthSchemavariant)Responsibility: an app author declaring
auth: { type: 'signed', scheme, keyId, … }on anopenapi/restconnector instance, with the secret only as acredentialRef, and every outbound request signed by a shipped signer whose output reproduces the vendor's vectors; an enum member without a shipped signer is not admitted (ADR-0049).Thread-read: 6522856999
Ruling-ref: ADR-0143 (Accepted on
main, PR #27231), Q4 letter A with its condition 1 naming the Alipay memberalipay-v3(notalipay-rsa2):alipay-v3,aliyun-acs3-hmac-sha256,tencentcloud-tc3-hmac-sha256Premise: read on
main@f64724ac:ConnectorInstanceAuthSchemadeclaresnone | bearer | api-key | basiconly; the thread re-reads and plans slices before code.Serial constraints cleared: no open PR touches
connector-auth.zod.ts,connector-openapiorconnector-rest(checked against the open PR list).Dispatch-note: p1,
security: rule-level text only on GitHub.CONTRACT_REVIEW_TIERreview owed (spec path, Clause-② yes) before any approval. Expected to land as slices; each slice PR names its part. Claimed with the coordinator's go under the project-wide cap of 10 (2026-10-30 22:48Z).objectstack-fleet commentedon Oct 31, 2026
domain:server#3 · os-elon-musk · session_016WV4cxRP1AqTeP2PWAhwGK
os-dev-report
{ "issue": 26710, "status": "done", "branch": "claude/project-thread-tpb1yk", "pr": "https://github.com/objectstack-ai/objectstack/pull/28273", "session": "session_016WV4cxRP1AqTeP2PWAhwGK", "premise_still_valid": true, "summary": "Slice 1 of 3 of the seat-accepted plan; the PR carries Refs #26710, so the card stays open for S2 (tencentcloud-tc3-hmac-sha256) and S3 (alipay-v3 with response verification, Fixes). S1 adds the signed kind of declarative connector-instance auth with one scheme, aliyun-acs3-hmac-sha256: scheme + public keyId + the signing key as credentialRef only. Publish refuses an unknown or missing scheme by name, inline key spellings, an authored signature, and signed on provider mcp. The host binds the resolved key to the scheme signer and hands providers only the signer (with an optional response-verification step); rest and openapi sign every attempt including retries and acknowledge it; a provider that does not acknowledge is refused at boot; a datasource borrow of a signed instance is refused 422. bearer/api-key/basic are unchanged.", "tests": "Vendor vector: Alibaba Cloud V3 signature worked example reproduced byte for byte (canonical request, string to sign, signature, Authorization); wrong key differs. vitest: spec integration + pins 13 files 211 passed; service-automation request-signing + materialization + credential-source 93 passed; connector-rest 32 passed; connector-openapi 75 passed. typecheck green for spec, service-automation, connector-rest, connector-openapi. Ablations (on-disk mutation, restored via git checkout): host acknowledgement check removed -> 2 boot-refusal pins red; signature cached across attempts -> per-attempt pin red; rest provider not passing the signer -> 4 pins red incl. end-to-end.", "gates": "dispatch-gates --commands derived 115; all run with exit codes recorded before any pipe; 3 first exited 3 (prerequisites: pinned teardown fixture fetch, dist closure) and exited 0 on rerun; --ran: 115 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. check:generated --fix regenerated api-surface, export-origins, declaration-map, docs, strictness-ledger and re-checked green; check:variant-docs green. CI check-runs on the PR: pending at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "reads only (issue_read, search_pull_requests, pull_request_read); no write tool", "api_writes": "2 via fleet-write relay: pr_create (#28273, with assignees as the seat lane PRs carry), this comment. git push is not a REST write.", "open_questions": [], "out_of_scope_findings": [ "carrier: #28226 · skills/objectstack-automation text for the signed kind rides the existing skills follow-up (a skills/** edit would make this slice Tier H)" ] }objectstack-fleet commentedon Oct 31, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
ACCEPT → PR #28273 (slice 1 of 3: the
signedkind andaliyun-acs3-hmac-sha256) · 2026-10-31T00:53Z · contract review PASS 6536676170 (CONTRACT_REVIEW_TIER, head8c6135c7) · ready + auto-merge armed through the relay. The card stays open for S2 and S3.objectstack-fleet commentedon Oct 31, 2026
domain:server#3 · os-elon-musk · session_016WV4cxRP1AqTeP2PWAhwGK
os-dev-report
{ "issue": 26710, "status": "done", "branch": "claude/project-thread-tpb1yk", "pr": "https://github.com/objectstack-ai/objectstack/pull/28279", "session": "session_016WV4cxRP1AqTeP2PWAhwGK", "premise_still_valid": true, "summary": "Slice 2 of 3 of the seat-accepted plan, on a branch restarted from main after #28273 merged; the PR carries Refs #26710, so the card stays open for S3 (alipay-v3 with response verification, Fixes). S2 adds tencentcloud-tc3-hmac-sha256 to the closed signing-scheme list with its signer and its own strictObject shape: scheme + public keyId (the SecretId) + the SecretKey as credentialRef only. The publish refusals of S1 apply to the new shape (inline key spellings by name, an authored signature, signed on provider mcp); secretId is answered with keyId; the unknown-scheme refusal names both shipped schemes. Every attempt is signed with a fresh X-TC-Timestamp over content-type and host. Folds in the #28273 review nit: ConnectorRequestSigner.scheme is typed by the scheme list (unreleased interface). bearer/api-key/basic and the aliyun scheme are unchanged.", "tests": "Vectors: the two sign3 cases (POST application/json, GET form) of the official tencentcloud-sdk-nodejs release 4.1.336 test/common/sign.test.ts reproduced byte for byte with that suite's placeholder key pair; the test file names the SDK, release and file; wrong key differs. vitest: spec signed + fetch-policy + grant-kinds + connector-auth + pins 74 passed; service-automation signing + materialization + credential-source 105 passed; connector-rest 33 passed (new tencent end-to-end); connector-openapi 75 passed. typecheck green for spec, service-automation, connector-rest. Ablations (on-disk mutation, restored via git checkout): registry case removed -> service-automation typecheck TS2322 naming the unhandled shape; TC3 key prefix dropped -> 6 vector pins red.", "gates": "dispatch-gates --commands derived 105; all run with exit codes recorded before any pipe, all exit 0; --ran: 105 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0. check:generated --fix regenerated api-surface, export-origins, declaration-map, authorable-surface, json-schema manifest, docs references and strictness ledger, re-checked green; check:variant-docs green. CI check-runs on the PR: pending at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "reads only (issue_read, pull_request_read, search_pull_requests); no write tool", "api_writes": "2 via fleet-write relay: pr_create (#28279, with assignees as the seat lane PRs carry), this comment. git push is not a REST write.", "open_questions": [], "out_of_scope_findings": [ "carrier: #28226 · skills/objectstack-automation text for the signed kind rides the existing skills follow-up (a skills/** edit would make this slice Tier H)" ] }objectstack-fleet commentedon Oct 31, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Maintainer ruling on slice 3 (
alipay-v3) vectors: option B · 2026-10-31T06:53ZAnalysis-tier: ceiling
Neither the vendor's documents reachable here nor any official SDK test suite we could reach carries a complete byte-exact v3 vector (Java v3, PHP, .NET and Node were each read). At 2026-10-31T06:48Z the maintainer agreed to the decision thread's recommendation in the project chat (「其他同意」):
Slice 3 (
alipay-v3plus response verification, carryingFixes #26710) is buildable on this ruling. S1 (#28273) and S2 (#28279) are merged. The seat is signing off, so the card returns topm:queuein the release that follows.objectstack-fleet commentedon Oct 31, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Release:
session_016WV4czuTWNgKR22fKv7jia(card threadsession_016WV4cxRP1AqTeP2PWAhwGK) · 2026-10-31T08:13Z · maintainer's wind-down order · partial landing: S1 #28273 and S2 #28279 merged; slice 3 goes topm:queuefor the next seatResume-from:
claude/project-thread-tpb1yk@e8422d9e0fc35f4ae3cd9e7681d7b612cd5a5981Fixes #26710.needs-user-decision, plus requesting os-zhuang and hotlong.main.--ran, thenpnpm lint.objectstack-fleet commentedon Oct 31, 2026
domain:server#4 · os-zhuang · session_01QUs3BtyH9zgxKzYrJiH18J
pm:retriage· lane question for slice 3 · 2026-10-31T08:36Z · ⛔ not a claimResume-frombranch (claude/project-thread-tpb1yk@e8422d9e, Release 6541018061) changespackages/specagainstorigin/maina878ff6c2:src/shared/connector-auth.zod.ts(+43 −…),src/integration/connector.zod.ts, and theauthorable-surface,api-surface,declaration-map,export-originsintegration ledgers.references/lanes/server.md红线: 「触packages/spec的卡一律归 spec 席」. A new auth scheme in the authorable surface also reads asClause-②: yes.domain:specwith the server half riding it; or name a lane PM under the cross-domain exception path with a declared file surface. The released work, rulings (vectors option B 6540304247; acceptance 「算」) and the five steps left stand as written in the Release.pm:queuestays on the card; onlypm:retriageis added.objectstack-fleet commentedon Oct 31, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: retriage answer · slice 3 relabelled
domain:spec· 2026-10-31T08:55Z⛔ Not a claim.
packages/spec(connector-auth.zod.ts,connector.zod.tsand the surface ledgers). That is a protocol addition (Clause-②: yes), and 「触 packages/spec 的卡一律归 spec 席」.domain:specclaims slice 3, resuming from the released branch. The server half (the signers and vectors in theopenapi/restproviders) rides under a one-PR exception with a declared file surface. A contract review is owed. The rulings (vectors option B, acceptance 「算」) and the five steps left stand.pm:retriageanddomain:serverremoved,domain:specadded. It stays p1securityinpm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Claim: PM loop round 3 · slice 3 resume · 2026-10-31T14:29Z
Session:
session_017ihL2fi9zfJhUTubyJYb6VAccount:
marchtianBranch:
claude/issue-26710-alipay-v3-signing(cut from the Release'sResume-from: claude/project-thread-tpb1yk@e8422d9e0fc35f4ae3cd9e7681d7b612cd5a5981; the released branch is not pushed to)Worktree:
objectstack-issue-26710Domain:
domain:specSeat:
domain:spec#4Ruling-ref: triage's retriage answer on this card (slice 3 relabelled
domain:spec, 2026-10-31T08:55Z); the Release's rulings stand unchanged: vectors option B, acceptance 「算」 (2026-10-31T06:56Z), the response-verification rule as a named seat call; the maintainer's 「可以并发3」 (2026-10-31T14:24Z) for this seat's concurrency.File surface: the 31 files on the resume head, unchanged in kind:
packages/spec/src/shared/connector-auth.zod.ts,packages/spec/src/integration/connector.zod.ts, their tests andtype-alias-convention.pin.test.ts; generated spec artefacts by repo tooling only (packages/spec/{api-surface,authorable-surface,declaration-map,export-origins,json-schema.manifest}/integration.json,variant-docs.json,content/docs/references/**);packages/services/service-automation/src/{plugin.ts,request-signing/**,*.test.ts}and itstest-vectors/alipay-v3/**;content/docs/automation/connectors.mdx;docs/adr/0143-outbound-connector-auth-is-open-tier.md(the dated D2.3 note: Tier H);.changeset/26710-signed-connector-auth-alipay.md. The server half rides this PR under triage's one-PR exception. Plus whatever themainmerge regenerates (stop on breach; explain in the report)Container & model:
L,mode:subagent,model: TIER_DEFAULT(opus) under the quota-exhaustion exemption (maintainer 「你没有fable了,使用 opus开发完之后等契约复审」),effort: high(p1, security)Clause-②: yes (widening)
Metadata-protocol: added
Responsibility: an app author declaring
auth: { type: 'signed', scheme: 'alipay-v3', … }on anopenapi/restconnector, with every request signed and every response below 400 verified against the vendor public key | thealipay-v3member of thesignedscheme list, its signer and verifier | China-lane marketplace connectors to Alipay (the card's business reason)Thread-read: 6541018061
Premise: holds. The resume head is 42 commits behind
mainwith S1 #28273 and S2 #28279 merged; the head carries the built slice 3 and five steps left (mergemain, every gate family +--ran+pnpm lint, three ablations, PR via the relay, contract review then governed approval)Serial constraints cleared: of the open PRs, only #28346 (draft, doc comment in
service-automation/src/plugin.tsL2091) touches a file here; no open PR touchesconnector-auth.zod.ts,request-signing/**or ADR-0143Dispatch-note: Tier H (the ADR note):
needs-user-decisionand a request to os-zhuang and hotlong beforepr_ready. ACONTRACT_REVIEW_TIERcontract review is owed on the final head.objectstack-fleet commentedon Oct 31, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
os-dev-report
Reported 2026-10-31T16:51Z on head
7497850ebb.{ "issue": 26710, "status": "needs_decision", "branch": "claude/issue-26710-alipay-v3-signing", "pr": "https://github.com/objectstack-ai/objectstack/pull/28446", "head": "7497850ebb26f13acd0f2e7568cf4d200013e09a", "session": "session_017ihL2fi9zfJhUTubyJYb6V", "premise_still_valid": true, "summary": "Slice 3 resumed from the Release's head e8422d9e0f: merged origin/main twice through os-regen-merge.sh (to a8d2fd7f30, then aaa5c1df8d); the only regenerated artifact was content/docs/references/index.mdx (both sides' counts kept), committed on its own; no hand conflict. The S1 and S2 changesets are still unconsumed on main and @objectstack/service-automation 18.2.0 on npm predates S1, so the changeset's 'in no release yet' sentence holds unchanged. Draft PR #28446 opened through the relay, Fixes #26710, no labels, no assignees, no reviewers. One owed fix waits on the seat: the published skill text skills/objectstack-automation/references/integration-recipes.md still says no signed scheme signs RSA (Alipay blocked) and lists two schemes; this PR makes that false, and the file is outside the claim's surface, so it was not touched.", "tests": "On head 7497850ebb: typecheck spec, service-automation, connector-openapi, connector-rest exit 0. vitest: service-automation 245 files / 3126 tests passed; connector-openapi 8 / 92 passed (acceptance included); connector-rest 5 / 43 passed; spec src/integration + src/shared + type-alias pin 50 / 1170 passed. Ablations via scripts/ablation-replace.mjs (anchor 1->0, blob changed, restore proven to the HEAD blob, git status clean after), subjects reached through source so no build: A1 verifyResponse made a no-op -> alipay-v3.test.ts 4 red + acceptance case 2 red; A2 one byte of the POST vector swapped -> 5 red incl. 'reproduces the POST (JSON body) request signature'; A3 alipay-v3 case dropped from the signer switch -> service-automation typecheck exit 2, TS2322 not assignable to never.", "gates": "dispatch-gates --commands derived 110 on 7497850ebb; all run, exit codes captured before any pipe: 109 exit 0 first run; pnpm check:type-check-debt exit 3 (PREREQUISITE NOT MET, closure build starved on the verify lock) then exit 0 re-run inside the lock. --ran over the 'command :: exit code' record: 110 derived, 110 run, 0 NOT-MEASURED (derived), 0 UNRUN. pnpm lint exit 0. spec check:generated: 14/14 up to date. CI check-runs: pending at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "31 files, +1325 / -57 (1382 changed lines) vs the 3000 human-merge threshold: under", "files_changed": 31, "deviations": [ "spec tests narrowed to src/integration, src/shared and type-alias-convention.pin.test.ts; the full spec suite and test:repo are CI's", "the worktree's branch was tracking origin/claude/project-thread-tpb1yk at hand-off; upstream unset and repointed to origin/claude/issue-26710-alipay-v3-signing before the first push; nothing was pushed to the released branch", "the two merge commits are os-regen-merge.sh's own messages and carry no trailer pair; the four resumed commits keep the released thread's session trailer; history not rewritten", "the drafted PR body was not in the repo: the PD#2 and D4 flags were reconstructed from the diff (PD#2 = connector-fetch-policy.ts runtime code in packages/spec that this slice first relies on; D4 = the signed signer bound at materialization, not per dispatch, now also for vendorPublicKeyRef)", "no independent (Fable) review run, per the order's quota exemption; the PR body says so", "PR body omits a Skills-docs line, and its Acceptance notes name #28226 as the skills carrier, but #28226 is closed, without the alipay text: the body is stale on that point and needs the seat's edit (dev writes the body once)" ], "mcp_calls": "0 — no MCP GitHub tool called", "api_writes": "2 via the fleet-write relay: pr_create (#28446, read back identical, 11202 bytes) and this comment. git push is not a REST write.", "open_questions": [ { "question": "The published skill text skills/objectstack-automation/references/integration-recipes.md (lines 32-33 list only aliyun and tencent; line 157 says 'RSA-signing vendor (Alipay, WeChat Pay): no signed scheme signs RSA yet; blocked on the request-signing card') becomes false when #28446 lands. It is outside the claim's file surface. How is it fixed?", "options": [ "A: widen the file surface by that one file and let this PR fix it (about 4 lines: add alipay-v3 with vendorPublicKeyRef to the scheme list; narrow line 157 to WeChat Pay). The PR is already Tier H, so the tier does not change.", "B: a follow-up card on domain:skills, filed and linked before #28446 lands, so the false sentence ships for at most the gap between the two merges." ], "recommendation": "A, because the os-dev rule makes a published text this round turns false a must-fix, and the PR already carries the Tier H approval cost; then the PR body's Acceptance-notes carrier line and a Skills-docs line need the seat's edit either way." } ], "out_of_scope_findings": [ "class: b · reach: release-text (exception) · skills/objectstack-automation/references/integration-recipes.md:157 'no signed scheme signs RSA yet' and :32-33 two-scheme list turn false when #28446 lands; Seam: spec:ConnectorSigningSchemeSchema -> consumer: skills/objectstack-automation recipe text · dedupe words: alipay-v3 skills recipe, signed scheme RSA, integration-recipes signed · held for the seat's decision above", "carrier: seat (contract review) · PD#2: readConnectorResponse and the per-attempt signing wrap live in packages/spec/src/integration/connector-fetch-policy.ts (landed with S1); alipay-v3 is the first scheme whose verifyResponse is non-empty · noted in the PR body, not filed" ] }objectstack-fleet commentedon Oct 31, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Claim amendment · 2026-10-31T16:52Z · claim 6544716671 · PR #28446
File surface amended by this seat: +
skills/objectstack-automation/references/integration-recipes.md. The dev's report (6546335469) found that this PR makes two lines of it false: the scheme list at L32–33 names only the aliyun and tencent schemes, and L157 says "nosignedscheme signs RSA yet; blocked on the request-signing card". Published text a round makes false is fixed in the same round, so the fix rides #28446 (about four lines) rather than a follow-up card. The PR is already Tier H (the ADR-0143 note), so the governed path does not change; the contract review covers the skills hunk too.Nothing else on the surface moves.
objectstack-fleet commentedon Oct 31, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Landed · 2026-10-31T22:28Z · PR #28446 merged by the queue at 2026-10-31T22:28Z as
f79fa7429c. This was slice 3 of 3 (S1 #28273, S2 #28279), so the card closed byFixes. This seat stripspm:dispatchedin the same act.What landed:
alipay-v3joins thesignedscheme enum as{ type: 'signed', scheme: 'alipay-v3', keyId, credentialRef, vendorPublicKeyRef }. Every request is signedALIPAY-SHA256withRSA. Every response below 400 must verify against the Alipay public key, an empty body included; a signed error response is verified, and an unsigned one passes through as an error. The landing also carries the ADR-0143 D2.3 and Acceptance notes and theintegration-recipes.mdcorrection.Record: