Repository navigation
docs(skills): the automation skill's OAuth recipe names a stdio MCP server's credential route as transport.credentialEnv - #30437
Conversation
…erver's credential route as transport.credentialEnv Recipe 6 of objectstack-automation/references/integration-recipes.md said a stdio server's credentials ride transport.env, the literal-in-metadata route the connector-credential-literal advisory warns against. It now says what the mcp provider does on main: the grant-bearing kinds stay http only; a stdio server takes a static auth with a credentialRef, handed to the child process in the variable transport.credentialEnv names, never a literal in transport.env. Paid inside the file's token ceiling by dropping the opening paragraph's restatement of the packaged spec and of where an api hook's secret goes (SKILL.md and recipe 4 keep both). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh
|
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh Contract reviewServed-tier: Rendered 2026-11-05T11:37Z against card #29625 (body and all three comments), PR #30437 (body, file list, net diff against ① Derived judgments
② Semver level
③ Boundary flagsDev deviations, five, each answered:
Out-of-scope observation (carrier none): " The card's serial constraint (after PR #29621) is met: the provider code the text now describes is on ④ Design judgment
Recipe 6 parenthetical (lines 155–159) — holds.
Opening paragraph (lines 6–10): the deleted sentence's two facts survive in what
Must-fix: none. Should-fix: none. Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh 席位核对 — ACCEPT ·
|
Fixes #29625
Clause-②: no
Metadata-protocol: none
维护者速读
skills/objectstack-automation/references/integration-recipes.md配方 6 的括注 —— stdio MCP 服务器的凭据不再说「走transport.env」,改为「静态auth: { type: 'bearer', credentialRef },放进transport.credentialEnv命名的变量,不在transport.env里写字面量」;开头段删去两句在 SKILL.md 与配方 4 已有家的复述,用来付这份文件的 token 天花板(10376 → 10363 字节,2591/2595 tokens,行数 183 → 183)。mcpprovider 把解析后的静态凭据放进子进程环境变量(packages/connectors/connector-mcp/src/mcp-provider.ts的credentialEnvOf);旧文字教的正是connector-credential-literal告警所反对的「凭据字面量写进元数据」路线,而这份文字经npx skills add原样装进客户项目。auth」读成 oauth2 也能上 stdio —— 括注开头仍写明 grant 类httponly,与 provider 的拒绝一致。integration-recipes.md第 155–159 行(配方 6 新括注,风险 hunk);② 同文件第 9–10 行(删句);③.changeset/29625-stdio-credential-env.md。node scripts/check-skills-token-ratchet.mjs预期绿;grep -n "transport.env" skills/objectstack-automation/references/integration-recipes.md预期只命中一处,即新括注里的「never a literal intransport.env」。skills/**是 Tier H ——GOVERNED_APPROVERS账号 APPROVE 一次,席位随后落地。What changes
Recipe 6 of the automation skill's integration recipes said: "
mcp(httponly; astdioserver's credentials ridetransport.env)". That parenthetical teaches the literal-in-metadata route. It now says what themcpprovider does onmain:Read off the code, not the card (
packages/connectors/connector-mcp/src/mcp-provider.ts,credentialEnvOfandnormalizeTransport):credentialEnvnames the environment variable the child is started with; the value is the resolved static credential — abearertoken, anapi-keykey, abasicpassword. The same spelling ascontent/docs/automation/connectors.mdx§ A stdio server's credential and theconnector-credential-literaladvisory's hint.httponly" stays true for the recipe's grant-bearing kinds: a grant-bearingauthon a stdio transport fails the boot, naming this static route.transport.envis passed to the child as written, stored in metadata, and reported by the advisory — hence "never a literal".Paid inside the file's shrink-only token ceiling (2595) by deleting one sentence of the opening paragraph that restated two facts with surviving homes: "A spec is not a secret and ships in the package" (SKILL.md § Integrations are declared, not coded: "a packaged spec"; recipe 1's
spec: './src/connectors/stripe.trimmed.json') and "anapiflow's hook secret goes to the deployment and to the sender" (SKILL.md'ssecretRefrow: "an env var the deployment fills"; recipe 4: "The sender signs each post underCARRIER_HOOK_SECRET"). No re-wrap bought a line:skills/**is 6 added / 6 removed, net 0 lines, net −13 bytes.Also checked, unchanged: recipe 1 never said the old route; recipe 2's
// stdio needs the host's allowlistcomment still holds; neitherSKILL.md,evals/integrations-declared.jsonnorevals/flows-triggers-approvals.jsonmentionsstdio,transport.envorcredentialEnv, so no eval asserted the old route and none changes.Changeset:
.changeset/29625-stdio-credential-env.md,'@objectstack/skills': patch, carrying the two declaration lines.Tests
Prose only; no test file changes. The gates that read this surface are under Verification.
Acceptance notes
packages/specdeclares no Zod schema forproviderConfig.transport.credentialEnv; the key is judged at boot by themcpprovider and by theconnector-credential-literaladvisory, which is whereconnectors.mdxpoints too. Observed only, consistent with the transport being provider-owned; noted, not filed.skills/**line budget: net 0 (budget ≤ +3). Token ceiling: 2591 of 2595 after the edit.Verification
Head
ef7770a8;git status --porcelainempty when the union ran, so every reading below is of this head's tree.node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack skills/objectstack-automation/references/integration-recipes.md→Model tier — MANDATORY: claude-fable-5-1, clause ① (skills/**, no one-line exit). This run is that tier.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; the tool took the change set from the merge-base) derived 43 families. Each ran in the foreground with its exit captured before any pipe, then--ranreconciled:`--ran` verdict: 43 derived, 38 run, 5 NOT-MEASURED, 0 UNRUN
The five read a built
dist/across the whole workspace ("Not one of the 131 workspace package(s) under . has adist/"); this diff touches no package, so no build closure is owed locally and CI'sLint & Repo Gatescarries them. Every other family exited 0.The three gates the dispatch named, verdict lines
Dogfood battery: n/a — no
!in the title and no(narrowing)arm.Generated by Claude Code