Problem
PR #6224 (issue #6222) introduced a credential mode model (wif/oidc/token) to the repos management commands that conflates mint authentication with inference WIF requirements. The core bug: needsWIF in install.go:219 is now gated on credMode == CredModeWIF, which means GitHub repos using the default oidc mode skip writing FULLSEND_GCP_PROJECT_ID and FULLSEND_GCP_WIF_PROVIDER secrets. Those secrets are required for Vertex AI inference and have nothing to do with the mint.
PR #6241 (open) extends this further by stripping WIF secret references from the per-repo workflow shim when credential mode is oidc — but reusable-dispatch.yml unconditionally calls setup-gcp, so inference would break.
The terminology is also wrong: WIF is the general mechanism, OIDC is the token format. They aren't alternatives — both the "oidc" and "wif" credential modes use OIDC tokens exchanged via WIF. The real distinction is how the mint validates tokens (public JWKS vs private STS/WIF), which is a mint configuration detail, not a repo-level credential choice.
See Slack discussion with @bkorren (2026-08-16) for the full architectural critique.
Key Principles
-
Inference WIF is always required. Agents cannot work without LLM inference (Vertex AI). Every repo — GitHub and GitLab — needs FULLSEND_GCP_PROJECT_ID and FULLSEND_GCP_WIF_PROVIDER. No mode or flag should gate these.
-
Mint and inference are separate systems. Different WIF pools (fullsend-pool vs fullsend-inference), different purposes, different administrators. Repos commands should not conflate them.
-
The mint has two modes: public and private. Public (mint.fullsend.sh, ALLOWED_ORGS=*) vs private (self-managed, restricted orgs). This only affects FULLSEND_MINT_URL and whether mint enroll is needed. Public should be the default.
-
GitLab bot tokens use CI/CD variables. Per the original GitLab design doc (ADR-0028), bot PATs are stored as protected+masked CI/CD variables. No Secret Manager for bot token retrieval — that adds unnecessary complexity. WIF is still required for inference, just not for getting the bot token.
Changes Required
Code (internal/repos/)
manifest.go
- Remove
CredModeOIDC, CredModeWIF, CredModeToken constants
- Remove
CredentialMode field from GitHubForgeInfra, GitLabForgeInfra, RepoEntry, ResolvedConfig
- Remove
validCredentialModes map, IsValidCredentialMode(), ValidCredentialModesFor()
- Add mint mode concept (e.g.,
MintMode field — public or private, default public)
install.go
- Remove
resolveCredentialMode() function
- Restore
needsWIF to always be true — inference secrets are unconditionally written for both forges
- Remove
FULLSEND_CREDENTIAL_MODE variable from GitHub installs (nothing reads it at runtime)
- Remove credential mode from
installVarsForForge() and installSecretsForForge()
- Add mint mode handling that only affects
FULLSEND_MINT_URL
batch_install.go
- Remove credential mode gating on inference flag validation
- Remove credential mode discovery reads
migrate.go
- Default region to
"global" when not discovered (not warning with no value, not us-central1)
status.go
- Remove credential mode drift detection
uninstall.go
- Remove credential mode reference in cleanup variable list
discover.go
- Remove credential mode from
DiscoveredRepo if referenced
Scaffold (internal/scaffold/fullsend-repo-gitlab/.gitlab/ci/)
fullsend-agent.yml
- Remove the WIF/token branching for bot token retrieval
- Always use
FULLSEND_FORGE_TOKEN CI/CD variable for the bot PAT
- Keep WIF setup for inference (unconditional)
fullsend-poll.yml
- Same: remove credential mode branching, always use CI/CD variable for bot PAT
CLI (internal/cli/)
repos.go
- Add
--mint-mode public|private flag (default: public) if needed
- Remove
--credential-mode flag if it exists
repos_gitlab.go
- Remove Secret Manager bot token storage path (
setupGitLabBotToken WIF branch)
- Always store bot PAT as protected+masked CI/CD variable (
FULLSEND_FORGE_TOKEN)
- Remove
FULLSEND_BOT_TOKEN_SECRET variable setup
- Remove
cleanupGitLabBotTokenSecret() if it only handles Secret Manager cleanup
Documentation
docs/guides/getting-started/operations.md
- Remove "(WIF mode only)" annotations from
FULLSEND_WIF_PROVIDER, FULLSEND_BOT_TOKEN_SECRET, FULLSEND_GCP_PROJECT_ID, FULLSEND_GCP_WIF_PROVIDER — inference vars are always required
- Remove
FULLSEND_BOT_TOKEN_SECRET row entirely (no longer used)
- Update uninstall instructions to remove Secret Manager cleanup step
- Add sections for both GitHub and GitLab where platform-specific
docs/guides/infrastructure/infrastructure-reference.md
- Remove "WIF mode" / "OIDC mode" / "token mode" terminology
- Replace with "public mint" / "private mint" where referring to mint configuration
- Clarify that inference WIF is always required regardless of mint mode
- Ensure both GitHub and GitLab sections are present and accurate
Any other docs referencing credential modes — update to use correct terminology:
- "public mint" vs "private mint" for mint configuration
- Inference WIF is unconditional
- GitLab uses CI/CD variables for bot PAT (not Secret Manager)
What to Keep from #6224
variable → token GitLab terminology rename (correct cleanup)
MintRegistrar removal from migrate (mint calls stay in migrate for user convenience — it's a temporary command)
discover.go fix reading FULLSEND_GCP_REGION from org variables
- Region fallback fix (but change to default
"global" instead of warning with no value)
Related
Architectural Summary
|
GitHub |
GitLab |
| Forge tokens |
Mint (public or private) |
Bot PAT as CI/CD variable |
| Inference |
WIF (always required) |
WIF (always required) |
| Mint mode |
Public (default) or private |
N/A — no mint |
| Credential mode |
Removed |
Removed |
Problem
PR #6224 (issue #6222) introduced a credential mode model (
wif/oidc/token) to the repos management commands that conflates mint authentication with inference WIF requirements. The core bug:needsWIFininstall.go:219is now gated oncredMode == CredModeWIF, which means GitHub repos using the defaultoidcmode skip writingFULLSEND_GCP_PROJECT_IDandFULLSEND_GCP_WIF_PROVIDERsecrets. Those secrets are required for Vertex AI inference and have nothing to do with the mint.PR #6241 (open) extends this further by stripping WIF secret references from the per-repo workflow shim when credential mode is
oidc— butreusable-dispatch.ymlunconditionally callssetup-gcp, so inference would break.The terminology is also wrong: WIF is the general mechanism, OIDC is the token format. They aren't alternatives — both the "oidc" and "wif" credential modes use OIDC tokens exchanged via WIF. The real distinction is how the mint validates tokens (public JWKS vs private STS/WIF), which is a mint configuration detail, not a repo-level credential choice.
See Slack discussion with @bkorren (2026-08-16) for the full architectural critique.
Key Principles
Inference WIF is always required. Agents cannot work without LLM inference (Vertex AI). Every repo — GitHub and GitLab — needs
FULLSEND_GCP_PROJECT_IDandFULLSEND_GCP_WIF_PROVIDER. No mode or flag should gate these.Mint and inference are separate systems. Different WIF pools (
fullsend-poolvsfullsend-inference), different purposes, different administrators. Repos commands should not conflate them.The mint has two modes: public and private. Public (
mint.fullsend.sh,ALLOWED_ORGS=*) vs private (self-managed, restricted orgs). This only affectsFULLSEND_MINT_URLand whethermint enrollis needed. Public should be the default.GitLab bot tokens use CI/CD variables. Per the original GitLab design doc (ADR-0028), bot PATs are stored as protected+masked CI/CD variables. No Secret Manager for bot token retrieval — that adds unnecessary complexity. WIF is still required for inference, just not for getting the bot token.
Changes Required
Code (
internal/repos/)manifest.goCredModeOIDC,CredModeWIF,CredModeTokenconstantsCredentialModefield fromGitHubForgeInfra,GitLabForgeInfra,RepoEntry,ResolvedConfigvalidCredentialModesmap,IsValidCredentialMode(),ValidCredentialModesFor()MintModefield —publicorprivate, defaultpublic)install.goresolveCredentialMode()functionneedsWIFto always be true — inference secrets are unconditionally written for both forgesFULLSEND_CREDENTIAL_MODEvariable from GitHub installs (nothing reads it at runtime)installVarsForForge()andinstallSecretsForForge()FULLSEND_MINT_URLbatch_install.gomigrate.go"global"when not discovered (not warning with no value, notus-central1)status.gouninstall.godiscover.goDiscoveredRepoif referencedScaffold (
internal/scaffold/fullsend-repo-gitlab/.gitlab/ci/)fullsend-agent.ymlFULLSEND_FORGE_TOKENCI/CD variable for the bot PATfullsend-poll.ymlCLI (
internal/cli/)repos.go--mint-mode public|privateflag (default:public) if needed--credential-modeflag if it existsrepos_gitlab.gosetupGitLabBotTokenWIF branch)FULLSEND_FORGE_TOKEN)FULLSEND_BOT_TOKEN_SECRETvariable setupcleanupGitLabBotTokenSecret()if it only handles Secret Manager cleanupDocumentation
docs/guides/getting-started/operations.mdFULLSEND_WIF_PROVIDER,FULLSEND_BOT_TOKEN_SECRET,FULLSEND_GCP_PROJECT_ID,FULLSEND_GCP_WIF_PROVIDER— inference vars are always requiredFULLSEND_BOT_TOKEN_SECRETrow entirely (no longer used)docs/guides/infrastructure/infrastructure-reference.mdAny other docs referencing credential modes — update to use correct terminology:
What to Keep from #6224
variable→tokenGitLab terminology rename (correct cleanup)MintRegistrarremoval from migrate (mint calls stay in migrate for user convenience — it's a temporary command)discover.gofix readingFULLSEND_GCP_REGIONfrom org variables"global"instead of warning with no value)Related
Architectural Summary