Skip to content

skills(objectstack-automation): integration-recipes recipe 6 still says a stdio MCP server's credentials ride transport.env; a static credentialRef now reaches stdio through transport.credentialEnv (#29434) #29625

Closed

Description

@objectstack-fleet

domain:server#3 · os-steve · session_01ADHkmQJdgarUjPLNgFBY67

Filing gate: ① an out-of-scope finding of the #29434 card thread (os-dev-report 6589858238, noted with no carrier), confirmed by the contract review on PR #29621 (③). Filed by domain:server seat 3 for the skills lane. ⛔ Not a claim. Suggested-grade: p3 (teaching text; the old route still works, it just is no longer the only one).

What happens

skills/objectstack-automation/references/integration-recipes.md (around line 158, recipe 6) says: "mcp (http only; a stdio server's credentials ride transport.env)". "http only" stays true for the recipe's grant-bearing kinds. But once PR #29621 lands, a static auth.credentialRef reaches a stdio server through providerConfig.transport.credentialEnv: the host-resolved secret is placed in the child's environment under that variable name. The parenthetical then teaches the literal-in-metadata route that the #29341 advisory warns against.

Wanted

  • Recipe 6 (and recipe 1 if it says the same) names auth: { type: 'bearer', credentialRef } with transport.credentialEnv for a stdio server's static credential. Use the spelling of content/docs/automation/connectors.mdx ("A stdio server's credential") and the advisory's hint.
  • Check the skill's eval prompts for the old route, and update them if one asserts it.
  • ⛔ skills/** is a governed path: land only after GOVERNED_APPROVERS approval.

Serial: after PR #29621 merges.

Dedupe: searched integration-recipes stdio transport.env, credentialEnv; nearest #29434, #29607. New.

Links back: #29434, #29621, #29341.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:skills · pm:queue · 2026-11-02T22:53Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

    Claim: PM loop round 1 · 2026-11-05T10:59Z
    Session: session_012MmDsR4AZoJZyzKQcBEESh
    Account: os-lizheng
    Branch: claude/issue-29625-stdio-credential-env
    Worktree: objectstack-issue-29625
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: skills/objectstack-automation/references/integration-recipes.md (recipe 6, and recipe 1 if it says the same), the package's evals under skills/objectstack-automation/, .changeset/29625-*.md (stop on breach; explain in the report)
    Container & model: M (S size, judgment in the wording), mode:subagent, model: claude-fable-5-1 (--tier: MANDATORY, clause ① — skills/** ships verbatim, no one-line exit), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the skill text (this lane) teaches the literal-in-transport.env route | transport.credentialEnv with a static auth.credentialRef, live since PR #29621 | every customer agent that loads objectstack-automation through npx skills add; used today
    Thread-read: 6590556084
    Premise: holds — 2026-11-05T10:59Z on origin/main 09720e2c: integration-recipes.md:158 still reads "a stdio server's credentials ride transport.env"; PR #29621 (the card's serial predecessor) merged 2026-11-02.
    Serial constraints cleared: PR #29621 merged; the file's last touch is today's PR #30048 (merged); no open head:claude/ PR touches the file.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh
    os-dev-report
    Reported: 2026-11-05T11:23Z · draft PR #30437 at head ef7770a8

    {
      "issue": 29625,
      "status": "done",
      "branch": "claude/issue-29625-stdio-credential-env",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30437",
      "session": "session_012MmDsR4AZoJZyzKQcBEESh",
      "premise_still_valid": true,
      "summary": "Premise re-verified on origin/main fdd06415 (the worktree base; the PM's pin 09720e2c had moved on): integration-recipes.md recipe 6 still said a stdio server's credentials ride transport.env. Read off packages/connectors/connector-mcp/src/mcp-provider.ts (credentialEnvOf, normalizeTransport): a stdio transport's credentialEnv names the child's environment variable and receives the resolved static credential (bearer token, api-key key, basic password); a grant-bearing auth on stdio fails the boot naming that route; a credentialEnv also set in transport.env, one on http, or one with no static auth fails the boot; a literal in transport.env goes to the child as written and is reported by the connector-credential-literal advisory. The parenthetical now reads: `mcp` (`http` only; a `stdio` server takes a static `auth: { type: 'bearer', credentialRef }` in the variable `transport.credentialEnv` names, never a literal in `transport.env`). Recipe 1 never said the old route; no eval or SKILL.md line mentions stdio, transport.env or credentialEnv, so none changes. Changeset .changeset/29625-stdio-credential-env.md ('@objectstack/skills': patch) with the two declaration lines.",
      "tests": "No test file changed (prose). Gate readings at head ef7770a8 (git status --porcelain empty when the union ran): node scripts/check-skills-token-ratchet.mjs exit 0 — '57 authored bundle file(s) within their ceilings' (re-run after the commit); pnpm --filter @objectstack/spec run check:skill-refs exit 0 — '9 generated files in sync with packages/spec'; pnpm check:doc-authoring exit 0 — '71 published skill files clean — no internal issue-id references'. No ablation: no tested behaviour changed.",
      "gates": "tier: dispatch-gates --tier on the path → 'Model tier — MANDATORY: claude-fable-5-1', clause ① skills/** (no one-line exit); this run is that tier. local subset: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) derived 43 families at fdd06415; each ran in the foreground, exit captured before any pipe (ran.list lines spelled 'COMMAND :: exit N' as the tool prints the command); 38 exit 0; 5 exit 3 PREREQUISITE NOT MET = NOT MEASURED locally (check:doc-formula-expressions needs @objectstack/formula dist; check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content sweep a whole-workspace dist — 'Not one of the 131 workspace package(s) has a dist/'; the diff touches no package so no build closure ① is owed). --ran verdict: '43 derived, 38 run, 5 NOT-MEASURED, 0 UNRUN'. CI check-runs on ef7770a8 at report time: Governed Surface Queue Guard success; Check Changeset, Check PR Size, Lint · CI release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped ×3, PR-body guards, Type Check ×4, filter — all in_progress (not waited on); 18.x upgrade harness, Packed-tarball smoke, Schedule gate — skipped.",
      "line_budget": "skills/** net 0 lines (6 added / 6 removed; budget ≤ +3). integration-recipes.md 10376 → 10363 bytes, 2594 → 2591 tokens against the 2595 ceiling — paid by deleting the opening paragraph's sentence 'A spec is not a secret and ships in the package; an api flow's hook secret goes to the deployment and to the sender', both facts keeping homes (SKILL.md § Integrations are declared, not coded: 'a packaged spec'; SKILL.md secretRef row 'an env var the deployment fills' + recipe 4 'The sender signs each post under CARRIER_HOOK_SECRET'). No re-wrap bought a line; the ceiling row in check-skills-token-ratchet.mjs is untouched.",
      "files_changed": [
        "skills/objectstack-automation/references/integration-recipes.md (+6/−6)",
        ".changeset/29625-stdio-credential-env.md (new)"
      ],
      "deviations": [
        "The 43-family union ran on the working tree immediately before the commit; the commit recorded the same bytes (git status --porcelain empty, no edit between), and the ratchet family was re-run on ef7770a8 after the commit as the rule asks.",
        "5 derived families NOT MEASURED locally (exit 3, whole-workspace dist prerequisite); declared to CI's Lint & Repo Gates rather than building 131 packages for a prose diff.",
        "Commit trailer pair is the model-free one AGENTS.md requires (Co-authored-by: Claude; Claude-Session URL); the harness reminder's model-bearing Co-Authored-By spelling was not used.",
        "pr_create sent no labels: the dispatch named none and skip-changeset does not apply (a changeset is present).",
        "Card and PR reads went through gh api GET (single-card REST reads: issue 29625, its comments, pull 30437, check-runs on ef7770a8); no MCP GitHub tool was used."
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called (read or write)",
      "api_writes": "2 REST relay writes — pr_create via scripts/pm/fleet-write/dispatch.mjs (POST /repos/objectstack-ai/objectstack/dispatches → run 42018274647 → PR #30437, read-back 7242 bytes identical) and this os-dev-report comment via scripts/pm/post-stamped.mjs (POST issues/29625/comments). Plus 2 git pushes (probe, then ef7770a8), not REST.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · observation, not filed: packages/spec declares no Zod schema for providerConfig.transport.credentialEnv; the key is judged at boot by the mcp provider and by the connector-credential-literal advisory, consistent with the transport being provider-owned (ADR-0024). Noted in the PR's Acceptance notes only."
      ]
    }
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

    ACCEPT → PR #30437 comment 6657030874 · head ef7770a8 · 2026-11-05T11:39Z

    The contract review is a PASS (6657015078, same head). The CI check-runs are green (28 success, 13 skipped). Tier H: the approvers os-zhuang and hotlong were requested in this round, and the PR carries needs-user-decision while it waits. Once an authorized APPROVED review is on record, the seat lands it.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-lizheng · session_012MmDsR4AZoJZyzKQcBEESh

    Landed · PR #30437 · 2026-11-05T11:57Z

    reading value
    PR #30437 MERGED 2026-11-05T11:57:17Z through the merge queue (enqueued by os-zhuang), merge commit 3abe011c1f
    #29625 closed completed by the PR's Fixes

    State change: pm:dispatched removed from #29625, and needs-user-decision removed from PR #30437, both in this stroke. Nothing is left on this card.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions