Does a Snowflake connection profile make the Brigade both client-governed and secret-free? Partly. It is a good distribution channel but not a governance control, and the credential risk sits in the profile, not the manifest.
The question
"Does shipping the Brigade via a Snowflake connection profile satisfy client-governed rollout AND the no-secrets-on-disk rule (MCP creds via OAuth / env expansion, never in the manifest)?" This is the fifth open follow-up from [[2026-07-05-brigade-skills-snowflake-cortex-code]], which pitched connection-profile distribution as the governed path for deployment profile P3. [[2026-09-13-cortex-code-client-deployable-surface-p3-p4]] later settled the runtime question. This brief is a delta: it covers only governance and credentials.
What we already know (from the vault)
- The parent brief proposed the path but did not test it. It said the client-governed route is "ship the Brigade plugin via a Snowflake connection profile (org-admin-published, governed distribution)" and listed secrets as an open follow-up ([[2026-07-05-brigade-skills-snowflake-cortex-code]]).
- The Sept 13 delta brief put a Preview label on this path. The Cortex Code (CoCo) overview page labels Plugins, Model Context Protocol (MCP) and Agent Client Protocol (ACP) as Preview. Skills, subagents and hooks carry no preview label. So "connection-profile plugin distribution ... inherits the Preview label," and the GA-safe unit is loose skills, subagents and hooks ([[2026-09-13-cortex-code-client-deployable-surface-p3-p4]]).
- RDCO's rule is written for a single machine. The Model Context Protocol (MCP) setup SOP says "Do NOT use the
envblock in mcp.json for secrets ... The wrapper script pulls them from 1Password at process start" ([[mcp-server-setup]]). 1Password does not exist inside a client's Snowflake account, so the rule needs a client-side equivalent. - The architecture already keeps data tools out of the plugin. "The Code plugin ships the skills + a one-step pointer to the shared remote MCP server; the data tools live on that one remote server" ([[2026-06-14-caf-restructure-organizing-brief]]). The cellar stress-test scores that remote server as "ONE seam" whose cost is "hosting + auth" ([[2026-07-14-cellar-ports-adapters-kb-standards]]).
- The live manifests are clean (local check, 2026-09-14). A scan of
brigade-house/plugins/*found no.mcp.json, nomcpServersoruserConfigblock, no${VAR}references, and no literal credential values in anyplugin.json. Thesnowflake-cliplugin's reference docs already tell users to "Prefer env vars over--password" and show--authenticator EXTERNALBROWSER. So the manifest half of the rule is met today, but only because nothing in the Brigade needs a credential yet.
What the web says
- Snowflake does describe admin-shipped profile plugins, but not how they work. "Administrators can ship plugins as part of a Snowflake connection profile so that every user of that profile gets a consistent baseline of skills, agents, hooks, and MCP servers." Such plugins show up with origin
profile. The page gives no config key, file location or SQL, so it is unclear whether the profile is a localconnections.tomlentry or an account-side object (CoCo CLI plugins, undated, fetched 2026-09-14). - Snowflake's own rule matches RDCO's. The same page says: "Keep MCP credentials out of the manifest. Use environment variable expansion or OAuth in MCP server entries; never check tokens into plugin source." The only admin enforcement it documents is
areUserMcpServersAllowed: falsein managed settings, which skips plugin MCP servers along with user MCP servers. No plugin allowlist or install restriction is documented. The plugins page itself shows no Preview label, which conflicts with the overview page cited in the Sept 13 brief. - CoCo MCP config keeps secrets off disk by design. "CoCo expands environment variables in every field of
mcp.jsonbefore connecting" (${VAR},${VAR:-default},$VAR). Open Authorization (OAuth) 2.0 tokens for HTTP servers "are stored in the OS keychain and are refreshed automatically." Values passed tocortex mcp addvia-eor-H"are migrated into the OS keychain on first connection" and removed frommcp.json. In a headless container with no keychain, "credential storage degrades gracefully and no secrets are written to disk" (CoCo CLI MCP support, fetched 2026-09-14). A search summary of the CoCo changelog says MCP OAuth config now also accepts aclient_secret(not fetched). - The connection profile is itself a file on disk, and its auth mode decides compliance.
connections.tomlsupports password, key-pair (private_key_file) andexternalbrowsersingle sign-on (SSO). Snowflake "strongly recommends" supplying passwords throughSNOWFLAKE_CONNECTIONS_<NAME>_PASSWORDorSNOWFLAKE_PASSWORDenvironment variables rather than the file, and recommends encrypted over unencrypted private keys (Managing Snowflake connections; Python connector connect, search-level). - Inside Snowpark Container Services (SPCS), a stored credential is not needed. Snowflake injects a rotating OAuth token at
/snowflake/session/tokenthat authenticates the service's user, "can't be used outside Snowpark Container Services," and should be read fresh on each request (SPCS: working with services; SPCS SQL execution, search-level). - The Claude Code side has one trap. Plugin MCP entries expand
${CLAUDE_PLUGIN_ROOT},${CLAUDE_PLUGIN_DATA}and${CLAUDE_PROJECT_DIR}incommand/args/envandurl/headers.userConfigfields marked"sensitive": truego to the macOS Keychain, but fall back to~/.claude/.credentials.json"when Keychain rejects write" and on all other platforms, which includes Linux containers (Claude Code plugins reference, fetched 2026-09-14). Generic${VAR}and${VAR:-default}expansion in.mcp.jsonis documented, and an unset variable with no default fails the parse (Claude Code env vars, search-level).
Convergences and contradictions
- Convergence: the manifest rule is a vendor rule, not only an RDCO rule. Snowflake's plugin docs and RDCO's SOP say the same thing, and CoCo's keychain migration and headless no-write behavior enforce it mechanically. On "never in the manifest," the answer is a clear yes.
- Contradiction: "governed" means different things. The parent brief read connection-profile distribution as governance. The docs describe a consistent baseline (distribution), not enforcement. They document no allowlist, no way to block user-added plugins, and no statement on whether a user can edit or remove the profile's plugins. The enforcement tools that do exist are (a) Snowflake role-based access control (RBAC) on the profile's role (for example the
SNOWFLAKE.CORTEX_USERdatabase role and cross-region inference, from the Sept 13 brief) and (b) theareUserMcpServersAllowedmanaged setting. - Unresolved label conflict. The plugins page shows no Preview label, but the overview page (per the Sept 13 brief) labels Plugins as Preview. Treat plugins as Preview until a release note says GA.
Synthesis for RDCO
Verdict: connection-profile shipping satisfies the no-secrets-in-manifest half outright, and satisfies client-governed rollout only as distribution, not enforcement. Whether the whole deployment meets "no secrets on disk" depends on the profile's authenticator, which the manifest does not control. Snowflake's plugin guidance ("keep MCP credentials out of the manifest") matches RDCO's rule word for word. CoCo's MCP layer moves CLI-supplied secrets into the OS keychain and writes nothing when no keychain exists. The Brigade's manifests carry no MCP servers and no credentials today. So the manifest is not where the risk is.
The risk sits one layer down, in connections.toml. A profile that uses password = or an unencrypted private_key_file puts a long-lived secret on disk, and shipping plugins through it does not change that. For a client deployment, RDCO's 1Password-wrapper rule becomes three client-side patterns. (1) For human seats, use authenticator = "externalbrowser" against the client's identity provider (IdP), so the only thing stored is a cached token in the OS keychain. (2) For the service loop in SPCS, use the platform-issued rotating token at /snowflake/session/token, which cannot leave SPCS and is not a stored secret. (3) For any non-Snowflake MCP credential, supply it through ${VAR} expansion from an environment the client's platform injects. The usual way to do that is a Snowflake SECRET object exposed as an environment variable in the SPCS service spec. That pattern is well known but was not re-verified at a primary source in this brief. Two traps to avoid: never use Claude Code userConfig sensitive values in a Linux container, because they fall back to a plaintext ~/.claude/.credentials.json; and never put a confidential OAuth client_secret in a manifest, because CoCo now accepts one. Pass it through ${VAR} instead.
For the governance claim, change the pitch. Do not tell a client's Snowflake admins that the profile "governs" the Brigade. What they actually control is (a) which roles can use the profile's connection, and through it Cortex inference, set with Snowflake grants; (b) whether any plugin or user MCP servers run at all, set with areUserMcpServersAllowed; and (c) who can read the profile. A more accurate phrase for statement-of-work (SOW) language is "admin-distributed baseline, governed by Snowflake RBAC." Add the Sept 13 caveat as well: plugin distribution is Preview, so the GA-safe package is loose skills, subagents and hooks, and a profile-shipped plugin should only go to clients that accept Preview features.
What this implies for the Brigade. The Brigade has no credentials in its manifests today because it has no MCP servers yet. The first one arrives with the shared remote MCP server that the restructure brief puts behind every port crossing. That is when the rule becomes testable. The cheap safeguard is to make Gate-A's deterministic lint fail on any literal credential-shaped value in plugin.json or .mcp.json, and on any userConfig field marked sensitive in a plugin built for container deployment. Then the rule is enforced in code rather than remembered.
Why this is in the vault
It closes the governance-and-credentials cell for P3 in the Organizational Intelligence (OI) deployment matrix ([[2026-07-07-hex-deployment-matrix-v2]]). It also corrects the parent brief's "governed distribution" wording before it reaches a client admin or a Snowflake account executive (AE). And it gives the Brigade's Gate-A lint a concrete no-secrets rule to encode before the remote MCP server lands.
Open follow-ups
- How is a CoCo connection-profile plugin set actually defined and delivered (a
connections.tomlkey, a managed-settings file, or an account-side object), and can an end user override or remove it? - Does CoCo honor Claude Code plugin
userConfig(includingsensitive) and managed-settings keys such asstrictKnownMarketplaces, and where are CoCo managed settings deployed on a client fleet? - Can the CoCo CLI inside SPCS authenticate with the
/snowflake/session/tokenOAuth token through a connection profile, and how do SPCS service-specsecretsexpose Snowflake SECRET objects as environment variables for MCP${VAR}expansion?
Related
- [[2026-07-05-brigade-skills-snowflake-cortex-code]]
- [[2026-09-13-cortex-code-client-deployable-surface-p3-p4]]
- [[mcp-server-setup]]
- [[2026-06-14-caf-restructure-organizing-brief]]
- [[2026-07-14-cellar-ports-adapters-kb-standards]]
- [[2026-07-07-hex-deployment-matrix-v2]]
- [[2026-07-03-hex-deployment-matrix]]
Sources
- Vault: [[2026-07-05-brigade-skills-snowflake-cortex-code]] (parent brief; source of the connection-profile pitch)
- Vault: [[2026-09-13-cortex-code-client-deployable-surface-p3-p4]] (Plugins/MCP Preview label; CLI-in-SPCS runtime; RBAC gates)
- Vault: [[mcp-server-setup]] (RDCO no-secrets-on-disk SOP)
- Vault: [[2026-06-14-caf-restructure-organizing-brief]] (skills in plugin, data tools on one remote MCP server)
- Vault: [[2026-07-14-cellar-ports-adapters-kb-standards]] (remote MCP server as the single auth seam)
- Vault: [[2026-07-07-hex-deployment-matrix-v2]] and [[2026-07-03-hex-deployment-matrix]] (P3 profile definition)
- Local check (2026-09-14):
~/Projects/phdata-private/brigade-house/plugins/*manifest scan (no MCP servers,userConfig,${VAR}or literal credentials);snowflake-cli/skills/prime-snow-cli/reference/global-options.mdandsql.md(env-var and externalbrowser guidance) - Web (fetched): CoCo CLI plugins - Snowflake docs (undated)
- Web (fetched): CoCo CLI MCP support - Snowflake docs (undated)
- Web (fetched): Claude Code plugins reference
- Web (search-level): Managing Snowflake connections; Python connector: connecting; CoCo changelog; CoCo CLI settings
- Web (search-level): SPCS: working with services; SPCS: SQL execution
- Web (search-level): Claude Code environment variables
- Research-cap note: 4 WebSearch queries were run against a template cap of 3. WebFetch (3) and QMD (5) stayed within their caps. No paywalls were encountered.