Repository navigation
docs(skills,lint): the connector auth union declares oauth2 and app-credential, held degraded until a server runs the grant - #28290
Conversation
…redential, held degraded until a server runs the grant The automation skill's "Not yet" OAuth bullet said the declarative `auth` union has no `oauth2`. It now declares `oauth2` (grant `authorization_code` or `client_credentials`) and `app-credential` (`feishu`, `dingtalk`, `wecom`), the secret only a `credentialRef`; an instance of either is held degraded and calls no upstream until a server runs the grant, so the integration stays marked blocked. The bullet's raise is paid by two same-file restatement cuts. The integrations eval's expectation says the same. `os explain flow-credential-literal` names the grant-bearing and signing kinds and why its fix line never routes a literal to them; the rule's test holds every kind it names to the schema. Fix lines and rule logic are unchanged. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwLJsQpaepqfmrTGLL
📓 Docs Drift Check
What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
… narrow the signing gap to RSA vendors The "Not yet" signing bullet said no auth kind signs requests. `signed` with `aliyun-acs3-hmac-sha256` or `tencentcloud-tc3-hmac-sha256` is served on the openapi and rest providers, so the Holds auth bullet names it and the gap narrows to the RSA-signing vendors (Alipay, WeChat Pay). Paid by same-file restatement cuts; the recipes stay at their 2236-token ceiling. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cwLJsQpaepqfmrTGLL
|
domain:skills#2 · os-elon-musk · session_016WV4cwLJsQpaepqfmrTGLL Fold at the seat's request: head The "Not yet" signing bullet was false on
Same-file restatement cuts pay for it: that clause, and recipe 4's "name the gap and" (the "Not yet" heading says to mark the gap). Gates are re-running on this head. Results follow in the os-dev report. |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 81aae6f · 2026-10-31T03:33Z |
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS Contract reviewHead-sha: Inputs: the diff origin/main..pr-28290 (merge-base 5374967, which is also ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentRules face, the two skill files, against the code they cite and the scenario they are accepted against (eval 1: an AI author wiring DocuSign, OAuth-protected, with a vendor-signed webhook), plus the two lint files under the cross-domain exception:
Implemented-by: VERDICT: PASS Must-fix: none. Should-fix:
|
|
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS 维护者速读
席位意见:ACCEPT。契约复核 PASS,没有必改项,逐句对过代码:
第二条(签名)原本在本卡范围外,是卡线程发现的错句。同文件、紧挨着,本席让它并进来,一轮审批覆盖两处。卡片里「S1 服务后改写成菜谱」那一半,复核核实要等内置 provider 真正接收授权(S2)才可能,已另立 #28299 跟踪,所以本 PR 用 席位核对
|
…ypes text, and the two skills changesets PR #28170 and PR #28290 missed A `skills/**` change ships in `@objectstack/skills`, so it owes a patch changeset, never `skip-changeset` (contract review 6539232473, must-fix 1). PR #28170 and PR #28290 landed skill text under the same mistaken reading; their entries are carried here. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d156vwPo83g9GQuJSt
Requested by Elon · project thread
domain:skills#2 · os-elon-musk · session_016WV4cwLJsQpaepqfmrTGLL
Fixes #28226
Clause-②: no
Metadata-protocol: none
维护者速读
auth联合类型没有oauth2,PR feat(spec)!: oauth2 and app-credential connector instance auth; the runtime oauth2 variant retired (ADR-0143 S0) #28213 合入后这句已错。现改为:联合类型声明了oauth2(authorization_code/client_credentials)和app-credential(飞书 / 钉钉 / 企业微信),密钥只能写credentialRef;但服务端还没跑授权流程,这类实例被标为降级、不调用上游,所以集成仍标 blocked。评测 1 的期望同步改;os explain flow-credential-literal点名这三种新类型(含signed)并说明修复提示为何不指向它们。Skills-docs:跟进。fix:提示原样。recipes 文件在 token 天花板下,新增字节全靠同文件删两处重复付清(2229→2230 / 2236),不动 ratchet 脚本。回滚即 revert。skills/objectstack-automation/references/integration-recipes.md的 "Not yet" 第一条,再看packages/lint/src/rule-explanations.ts新增的那句。pnpm --filter @objectstack/lint exec vitest run src/lint-flow-credential-literals.test.ts和node scripts/check-skills-token-ratchet.mjs,预期 exit 0。skills/**),需 os-zhuang 或 hotlong 批准。What changes
skills/objectstack-automation/references/integration-recipes.md, "Not yet" OAuth bullet: the union now declaresoauth2(authorization_code/client_credentials) andapp-credential(feishu/dingtalk/wecom), the secret acredentialRef, but no server runs the grant yet: the instance is held degraded and calls no upstream. The advice stays: no short-lived token behind abearerref, blocked on the outbound-OAuth card.skills/objectstack-automation/evals/integrations-declared.json, eval 1: the expectation says the same. Rubric text only; everymust_contain/must_not_containtoken is unchanged and still true.packages/lint/src/rule-explanations.ts:os explain flow-credential-literalnamesoauth2(with its grants),app-credential(with its vendors) andsigned, says their secret is also only acredentialRef, and says why none is a home a literal moves into by shape.lint-flow-credential-literals.ts: the header comment no longer listsnone / bearer / api-key / basicas every variant. Thefix:hints are unchanged, so they still route tobearer,api-keyorbasic.lint-flow-credential-literals.test.ts: the existing "every auth variant ... the schema accepts" pin now parses each kind, grant and vendor the explanation names againstConnectorInstanceAuthSchema, and asserts the explanation carries them.@objectstack/lintpatch, since the explanation text ships inos explain.The degraded wording was read from the code on
main91fa06df8, not from the card:grantBearingNotServedReasoninpackages/services/service-automation/src/plugin.ts:415("…the instance is not served and is never called without its credential") andlendRefusalinconnector-credential-source.ts:118(a datasource borrow refused 422). Grants and vendors come fromConnectorOAuth2GrantSchemaandConnectorAppCredentialVendorSchemainpackages/spec/src/shared/connector-auth.zod.ts.Paid for in the same file (restatement only, each with a surviving home)
integration-recipes.md, bullet raise +103 bytes, paid by:
includecomment "tool-name allowlist → the actions" (recipe 1's paragraph saysincludeallowlists as themcpprovider's does, and recipe 2's flow comment dispatchesactionId: 'search_issues').2229 → 2230 tokens against the 2236 ceiling. No ceiling moved;
SKILL.mdis untouched.Verification
pnpm --filter @objectstack/lint testandtypecheck: exit 0.node scripts/check-skills-token-ratchet.mjs: exit 0 (recipes 2230/2236).dispatch-gates --commandsat the committed head derives 72 families. All 72 ran in a fresh worktree afterpnpm install --frozen-lockfile --ignore-scriptsand a whole-tree build, and all exited 0.--ranreconciles 72 derived / 72 run / 0 NOT-MEASURED / 0 UNRUN, and the derivation re-run at the head is identical.check-governed-merges.mjs --testreads the twoskills/**paths on the register, so Tier H. The register's reading at PR time is the seat's.pnpm lint, and the skill evals as a model run.Out of scope (finding for the seat)
signedwithscheme: 'aliyun-acs3-hmac-sha256'is onmain(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 S1), so that sentence is false for Aliyun. It is outside this card's claimed bullet and is left for its own card.Human Minimum
Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.
packages/specholds no runtime logic. (not touched)main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed. (not touched)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4cwLJsQpaepqfmrTGLL