Skip to content

docs: public community mint ADR and hosting spike (#915) - #1413

Merged
ifireball merged 14 commits into
fullsend-ai:mainfrom
ifireball:cursor/565c814c
Jul 14, 2026
Merged

docs: public community mint ADR and hosting spike (#915)#1413
ifireball merged 14 commits into
fullsend-ai:mainfrom
ifireball:cursor/565c814c

Conversation

@ifireball

@ifireball ifireball commented May 25, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds spike outcome for #915: GCP vs Cloudflare hosting comparison (cost, ops consoles, phasing).
  • Adds public community mint ADR: steady-state public community mint on Cloudflare Workers (option E), with interim GCP (option A) noted in passing; GitOps deploy (#1263), isolation from inference, per-repo + upstream reusable installs, Bootstrap SLO ownership. Trust policy cross-references ADR 0029 and ADR 0059.
  • Defers automated PEM key rotation to a future ADR (required, not in scope here).

Test plan

Closes #915 (spike deliverable). Supports #914 / #912.

Made with Cursor

@github-actions

github-actions Bot commented May 25, 2026

Copy link
Copy Markdown

Site preview

Preview: https://686b6a9e-site.fullsend-ai.workers.dev

Commit: ff9df42951060911504c82dc678be1ffc41173f0

ifireball and others added 2 commits May 25, 2026 15:29
ADR 0040 records deployment, security, monitoring, scaling, and
operations for the community mint profile; the spike holds platform
trade-offs from issue fullsend-ai#915.

Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Barak Korren <bkorren@redhat.com>
Focus Decision on steady-state Cloudflare Workers, defer automated
PEM rotation to a future ADR, and align options with ADR 0029 goal.

Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Barak Korren <bkorren@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented May 25, 2026

Copy link
Copy Markdown

Review

Docs-only PR adding ADR 0068 (public community mint architecture) and a hosting comparison spike for #915. The ADR is technically sound — all cross-referenced ADRs (0029, 0044, 0054, 0059, 0060) exist and claims about mintcore, JWKSVerifier/STSVerifier, and cmd/mint/ are verified accurate against the codebase. ADR number 0068 is the next available (0067 is latest on main). The VitePress sidebar, architecture.md cross-reference, and immutability comment block are all correctly wired.

No security findings. No correctness issues with the technical content.

Findings

Medium

  • [undocumented-pattern-introduction] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — This PR introduces a new docs/spikes/ directory and documentation pattern without establishing its governance. AGENTS.md provides guidance for problem docs ("When adding new problem areas, create a new file in docs/problems/") and ADRs ("Architecture Decision Records" section), but has no mention of spikes. CONTRIBUTING.md likewise has no guidance on when to write a spike vs. extend a problem doc vs. propose an ADR directly. The VitePress sidebar entry was correctly added using getMarkdownFiles() (following AGENTS.md line 108), and docs/experiments/ already sets this same auto-discovered category pattern — so the pattern is not unprecedented. However, without explicit governance guidance, contributors won't know when spikes are the appropriate format.
    Remediation: Add a brief note to AGENTS.md (near the problem docs guidance) or CONTRIBUTING.md explaining when to use spikes vs. problem docs vs. ADRs — e.g., "Spikes are time-boxed investigations that inform ADRs; create them in docs/spikes/."

Low

  • [internal-consistency] docs/ADRs/0068-public-community-mint-architecture.md (Consequences section) — The remaining-work list mixes tracked and untracked items: "shared Apps (#914), GitOps layout (#1263), JWKS parity CI, public-mode implementation in mintcore, SLO handoff criteria." The first two and the separately-bulleted PEM rotation (Automated PEM rotation for community mint shared App keys #4175) have tracking issue references; "JWKS parity CI", "public-mode implementation in mintcore", and "SLO handoff criteria" do not. This inconsistency makes the untracked items harder to follow up on.
    Remediation: File tracking issues for the three untracked items and add references, consistent with the sibling items.
Previous run

Review

Docs-only PR adding ADR 0068 (public community mint architecture) and a hosting comparison spike for #915. The ADR is technically sound — all cross-referenced ADRs (0029, 0044, 0054, 0059, 0060) exist and claims about mintcore, JWKSVerifier/STSVerifier, and cmd/mint/ are verified accurate against the codebase. ADR number 0068 is the next available (0067 is latest on main). The VitePress sidebar, README index entry, and docs/architecture.md cross-reference are all correctly wired.

No security findings. No correctness issues with the technical content.

Findings

Medium

  • [undocumented-pattern-introduction] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — This PR introduces a new docs/spikes/ directory and documentation pattern without establishing its governance. AGENTS.md provides guidance for problem docs ("When adding new problem areas, create a new file in docs/problems/ and link it from README.md") and ADRs ("Architecture Decision Records" section), but has no mention of spikes. The "Where does my contribution go?" table in README.md (lines 78–84) has rows for issues, problem docs, and ADRs — but no row for spikes. The PR adds docs/spikes/ to the document index but not to the contribution governance table. Without guidance, contributors won't know when to write a spike vs. expand a problem doc vs. propose an ADR directly.
    Remediation: Either (a) add a row to the "Where does my contribution go?" table and a brief section in AGENTS.md explaining when to use spikes, or (b) place this content under docs/problems/ using the existing governance model.

Low

  • [internal-consistency] docs/ADRs/0068-public-community-mint-architecture.md (Consequences section) — The remaining-work list mixes tracked and untracked items: "shared Apps (#914), GitOps layout (#1263), JWKS parity CI, public-mode implementation in mintcore, SLO handoff criteria." The first two and the separately-bulleted PEM rotation (Automated PEM rotation for community mint shared App keys #4175) have tracking issue references; "JWKS parity CI", "public-mode implementation in mintcore", and "SLO handoff criteria" do not. This inconsistency makes the untracked items harder to follow up on.
    Remediation: File tracking issues for the three untracked items and add references, consistent with the sibling items.
Previous run

Review

Docs-only PR adding ADR 0068 (public community mint architecture) and a hosting comparison spike for #915. The ADR is technically sound — all cross-referenced ADRs (0029, 0044, 0054, 0059, 0060) exist and claims about mintcore, JWKSVerifier/STSVerifier, and cmd/mint/ are verified accurate against the codebase. ADR number 0068 is the next available (0067 is latest on main). The VitePress sidebar, README index entry, and docs/architecture.md cross-reference are all correctly wired.

No security findings. No correctness issues with the technical content.

Findings

Medium

  • [undocumented-pattern-introduction] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — This PR introduces a new docs/spikes/ directory and documentation pattern without establishing its governance. AGENTS.md provides guidance for problem docs ("When adding new problem areas, create a new file in docs/problems/ and link it from README.md") and ADRs ("Architecture Decision Records" section), but has no mention of spikes. The "Where does my contribution go?" table in README.md (lines 78–84) has rows for issues, problem docs, and ADRs — but no row for spikes. The PR adds docs/spikes/ to the document index but not to the contribution governance table. Without guidance, contributors won't know when to write a spike vs. expand a problem doc vs. propose an ADR directly.
    Remediation: Either (a) add a row to the "Where does my contribution go?" table and a brief section in AGENTS.md explaining when to use spikes, or (b) place this content under docs/problems/ using the existing governance model.

Low

  • [internal-consistency] docs/ADRs/0068-public-community-mint-architecture.md (Consequences section) — The remaining-work list mixes tracked and untracked items: "shared Apps (#914), GitOps layout (#1263), JWKS parity CI, public-mode implementation in mintcore, SLO handoff criteria." The first two and the separately-bulleted PEM rotation (Automated PEM rotation for community mint shared App keys #4175) have tracking issue references; "JWKS parity CI", "public-mode implementation in mintcore", and "SLO handoff criteria" do not. This inconsistency makes the untracked items harder to follow up on.
    Remediation: File tracking issues for the three untracked items and add references, consistent with the sibling items.
Previous run (2)

Review

Findings

Medium

  • [undocumented-pattern-introduction] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — This PR introduces a new docs/spikes/ directory and documentation pattern without establishing its governance or relationship to existing patterns. The repo has docs/problems/ for open-ended exploration, docs/plans/ for implementation plans, and docs/ADRs/ for decisions. The distinction between "spikes" and these existing categories is not defined in AGENTS.md, the writing-adrs skill, or any ADR. The README.md addition describes spikes as "Time-boxed investigations and trade-off analyses that inform ADRs", which overlaps significantly with the stated purpose of problem docs. The "Where does my contribution go?" table in README.md does not mention spikes. Without clear governance, this creates ambiguity about when contributors should write a spike vs. extend a problem doc.
    Remediation: Add guidance to AGENTS.md defining when to use spikes vs problem docs vs plans, or place this content in docs/problems/ rather than introducing a new top-level category for a single file.

Low

Previous run (3)

Review

Findings

Medium

  • [undocumented-pattern-introduction] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — This PR introduces a new docs/spikes/ directory and documentation pattern without establishing its governance or relationship to existing patterns. The repo has docs/problems/ for open-ended exploration, docs/plans/ for implementation plans, and docs/ADRs/ for decisions. The distinction between "spikes" and these existing categories is not defined in AGENTS.md, the writing-adrs skill, or any ADR. The README.md addition describes spikes as "Time-boxed investigations and trade-off analyses that inform ADRs", which overlaps significantly with the stated purpose of problem docs. The "Where does my contribution go?" table in README.md does not mention spikes. Without clear governance, this creates ambiguity about when contributors should write a spike vs. extend a problem doc.
    Remediation: Add guidance to AGENTS.md defining when to use spikes vs problem docs vs plans, or place this content in docs/problems/ rather than introducing a new top-level category for a single file.

Low

Previous run (4)

Review

Findings

High

  • [missing-deployment-artifact] internal/dispatch/gcf/provisioner.go:46 — The PR adds pem_size.go.embed to internal/dispatch/gcf/mintsrc/mintcore/ and modifies gcp_pem.go.embed to call WarnWorkersPEMSize (defined in pem_size.go), but provisioner.go is not updated: neither the //go:embed directive (line 46) nor the embeddedMintFiles map (lines 52–69) includes mintcore/pem_size.go.embed. When the GCF mint is deployed, pem_size.go will be missing from the Cloud Function zip, and compilation will fail because gcp_pem.go calls WarnWorkersPEMSize which has no definition. The existing TestEmbeddedMintSourceSync test (line 1518) will also fail since pem_size.go is not in gcfSkip.
    Remediation: Add mintsrc/mintcore/pem_size.go.embed to the //go:embed directive on line 46, and add "mintcore/pem_size.go.embed": "mintcore/pem_size.go" to the embeddedMintFiles map.

Medium

  • [pr-title-prefix] PR title — The PR title uses the docs: prefix, but the PR includes Go code changes that add new runtime behavior: cmd/mint/main.go (adds WarnAllPEMsInDir call), internal/mintcore/pem_size.go (new file with exported functions), and modifications to file_pem.go and gcp_pem.go. Per COMMITS.md, docs: means "Documentation only" and does not appear in release notes. These code changes add observable startup warnings and should be categorized appropriately.
    Remediation: Change the PR title prefix from docs: to feat(mint): or refactor(mint): to ensure the Go code changes appear in release notes.

Low

  • [error-handling-idiom] internal/mintcore/pem_size.go:45WarnAllPEMsInDir silently ignores individual file read errors (the os.ReadFile error is swallowed with a bare continue). While this is a best-effort diagnostic function where swallowing errors is defensible, logging the error before continuing would help operators diagnose startup issues.
    Remediation: Add log.Printf("warning: reading PEM file %q: %v", entry.Name(), err) before the continue statement.

  • [test-integrity] internal/mintcore/pem_size_test.go:42TestWarnAllPEMsInDir is marked t.Parallel() but redirects the global log.SetOutput. The standard library's default logger is not goroutine-safe for SetOutput. TestWarnWorkersPEMSizeLogsOnce in the same file correctly omits t.Parallel() for this reason.
    Remediation: Remove t.Parallel() from TestWarnAllPEMsInDir.

  • [missing-doc] docs/guides/infrastructure/standalone-mint.md:146 — The startup logging section does not mention the new PEM size warnings emitted by WarnAllPEMsInDir(). Users running cmd/mint with oversized PEM files may see warnings at startup without finding them documented.
    Remediation: Add an example of PEM size warning output to the startup logging section.


Labels: PR modifies mint infrastructure code and adds ADR/spike documentation

Previous run (5)

Review

Findings

Medium

  • [error-handling-idiom] internal/mintcore/pem_size.go:45WarnAllPEMsInDir silently ignores individual file read errors (the os.ReadFile error is swallowed with a bare continue). Other PEM accessor methods in file_pem.go and gcp_pem.go propagate file read errors with fmt.Errorf wrapping. While this is a best-effort diagnostic function, logging the error before continuing would help operators diagnose startup issues.
    Remediation: Add log.Printf("warning: reading PEM file %q: %v", entry.Name(), err) before the continue statement.

Low

  • [test-integrity] internal/mintcore/pem_size_test.go:46TestWarnAllPEMsInDir is marked t.Parallel() but redirects the global log.SetOutput. The global logger is not goroutine-safe. TestWarnWorkersPEMSizeLogsOnce in the same file correctly omits t.Parallel() for this reason; existing tests in the package (e.g., TestHandler_LogsRequestedPermissionNotGranted in handler_test.go) follow the same discipline.
    Remediation: Remove t.Parallel() from TestWarnAllPEMsInDir.

  • [naming-convention] internal/mintcore/pem_size.go:12CloudflareWorkersSecretMaxBytes is exported but used only internally. Other mintcore constants (maxRepos, defaultForeignCacheTTL, maxClockSkew) are unexported.

  • [naming-convention] internal/mintcore/pem_size.go:14workersPEMWarnOnce is a package-level sync.Map. Other state in mintcore is encapsulated in structs. Since WarnWorkersPEMSize is called from both FilesystemPEMAccessor and GCPSecretPEMAccessor, package-level dedup is a reasonable choice, but differs from the established pattern.

  • [missing-doc] docs/guides/infrastructure/standalone-mint.md:146 — The startup logging section does not mention the new PEM size warnings emitted by WarnAllPEMsInDir(). Users running cmd/mint with oversized PEM files may see warnings at startup without finding them documented.

  • [missing-doc] docs/guides/infrastructure/mint-administration.md:134 — The PEM bootstrapping section does not mention the 5 KB Cloudflare Workers secret size constraint introduced by this PR. This limit is Cloudflare-specific and may be better suited for standalone-mint.md or a future Workers deployment guide.

Previous run (6)

Looks good to me

Previous run (7)

Review

Findings

Critical

  • [ADR-number-collision] docs/ADRs/0062-public-community-mint-architecture.md:1 — ADR number 0062 is already assigned to docs/ADRs/0062-dispatch-version-skew.md ("Resolving per-repo dispatch version skew", status Accepted). This PR creates a second, unrelated ADR with the same number. After merge, docs/architecture.md would contain two different [ADR 0062] references pointing to two different files (line 49 references 0062-dispatch-version-skew.md, the new bullet references 0062-public-community-mint-architecture.md). Every cross-reference to ADR 0062 in this PR (in the spike, in modified ADR 0059, in docs/architecture.md) links to the colliding number. Existing references in docs/plans/automatic-updates.md:121 and docs/ADRs/0048-automatic-updates.md:59 that cite ADR 62 for dispatch version skew would become ambiguous.
    Remediation: Renumber the new ADR to 0063 (the next available number on main; 0064 already exists). Update all references in this PR: the spike document, the modified lines in ADR 0059, docs/architecture.md, and README.md. The /renumber-adr skill exists in this repo for exactly this purpose.

Medium

  • [undocumented-directory-structure] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — The PR introduces a new docs/spikes/ directory. The README.md change adds an index entry, but the VitePress sidebar config (website/.vitepress/config.ts) has no entry for spikes. Per AGENTS.md: "Sections using getMarkdownFiles() are auto-discovered. All other sections need a manual { text, link } entry." The spikes directory is not covered by any getMarkdownFiles() call, so it will not appear in docs site sidebar navigation.
    Remediation: Add a getMarkdownFiles('spikes', 'spikes') entry or a manual { text, link } entry to the sidebar config in website/.vitepress/config.ts.
Previous run (8)

Review

Findings

Medium

  • [stale-reference] docs/architecture.md:151 — The new bullet references [ADR 0061](ADRs/0062-public-community-mint-architecture.md) — the link text says ADR 0061, but the target file is 0062-public-community-mint-architecture.md. ADR 0061 already exists as 0061-harness-cel-dispatch.md, a completely different ADR. This creates a misleading reference and a duplicate "0061" label in the document (the existing correct reference is at line 113).
    Remediation: Change [ADR 0061] to [ADR 0062] in the link text.

  • [stale-reference] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md:118 — The References section contains [ADR 0061 — Public community mint architecture](../ADRs/0062-public-community-mint-architecture.md). The link text says "0061" but the target file is 0062. ADR 0061 is the harness CEL dispatch ADR, not the community mint ADR.
    Remediation: Change [ADR 0061 — Public community mint architecture] to [ADR 0062 — Public community mint architecture].


Labels: PR adds ADR and spike documentation for the token mint component

Previous run (9)

Review

Findings

Low

  • [style/conventions] README.md — The docs/spikes/ directory is new (introduced by this PR) and is not indexed in README.md. The README already has index entries for docs/problems/, docs/plans/, docs/guides/, and docs/ADRs/. Consider adding a docs/spikes/ section so it is discoverable from the top-level index.
    Remediation: Add a docs/spikes/ entry to the document index in README.md, similar to the existing entries for plans and guides.

Info

  • [correctness] docs/ADRs/0040-public-community-mint-architecture.md — ADR number 0040 is the next available after 0039 on the target branch. No number conflict detected. All cross-referenced files (ADR 0029, docs/guides/admin/infrastructure-reference.md, .github/actions/mint-token/action.yml) exist in the repository.
Previous run (10)

Review

Findings

Critical

  • [ADR-number-collision] docs/ADRs/0062-public-community-mint-architecture.md:1 — ADR number 0062 is already assigned to docs/ADRs/0062-dispatch-version-skew.md ("Resolving per-repo dispatch version skew", status Accepted). This PR creates a second, unrelated ADR with the same number. After merge, docs/architecture.md would contain two different [ADR 0062] references pointing to two different files (line 49 references 0062-dispatch-version-skew.md, the new bullet references 0062-public-community-mint-architecture.md). Every cross-reference to ADR 0062 in this PR (in the spike, in modified ADR 0059, in docs/architecture.md) links to the colliding number. Existing references in docs/plans/automatic-updates.md:121 and docs/ADRs/0048-automatic-updates.md:59 that cite ADR 62 for dispatch version skew would become ambiguous.
    Remediation: Renumber the new ADR to 0063 (the next available number on main; 0064 already exists). Update all references in this PR: the spike document, the modified lines in ADR 0059, docs/architecture.md, and README.md. The /renumber-adr skill exists in this repo for exactly this purpose.

Medium

  • [undocumented-directory-structure] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md — The PR introduces a new docs/spikes/ directory. The README.md change adds an index entry, but the VitePress sidebar config (website/.vitepress/config.ts) has no entry for spikes. Per AGENTS.md: "Sections using getMarkdownFiles() are auto-discovered. All other sections need a manual { text, link } entry." The spikes directory is not covered by any getMarkdownFiles() call, so it will not appear in docs site sidebar navigation.
    Remediation: Add a getMarkdownFiles('spikes', 'spikes') entry or a manual { text, link } entry to the sidebar config in website/.vitepress/config.ts.
Previous run (11)

Review

Findings

Medium

  • [stale-reference] docs/architecture.md:151 — The new bullet references [ADR 0061](ADRs/0062-public-community-mint-architecture.md) — the link text says ADR 0061, but the target file is 0062-public-community-mint-architecture.md. ADR 0061 already exists as 0061-harness-cel-dispatch.md, a completely different ADR. This creates a misleading reference and a duplicate "0061" label in the document (the existing correct reference is at line 113).
    Remediation: Change [ADR 0061] to [ADR 0062] in the link text.

  • [stale-reference] docs/spikes/2026-05-25-community-mint-hosting-gcp-vs-cloudflare.md:118 — The References section contains [ADR 0061 — Public community mint architecture](../ADRs/0062-public-community-mint-architecture.md). The link text says "0061" but the target file is 0062. ADR 0061 is the harness CEL dispatch ADR, not the community mint ADR.
    Remediation: Change [ADR 0061 — Public community mint architecture] to [ADR 0062 — Public community mint architecture].


Labels: PR adds ADR and spike documentation for the token mint component

Previous run (12)

Review

Findings

Low

  • [style/conventions] README.md — The docs/spikes/ directory is new (introduced by this PR) and is not indexed in README.md. The README already has index entries for docs/problems/, docs/plans/, docs/guides/, and docs/ADRs/. Consider adding a docs/spikes/ section so it is discoverable from the top-level index.
    Remediation: Add a docs/spikes/ entry to the document index in README.md, similar to the existing entries for plans and guides.

Info

  • [correctness] docs/ADRs/0040-public-community-mint-architecture.md — ADR number 0040 is the next available after 0039 on the target branch. No number conflict detected. All cross-referenced files (ADR 0029, docs/guides/admin/infrastructure-reference.md, .github/actions/mint-token/action.yml) exist in the repository.

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added the ready-for-merge All reviewers approved — ready to merge label May 25, 2026

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: ADR 0040 + Community Mint Hosting Spike

The hosting analysis and ADR structure are solid. The phasing (GCP interim → Workers steady-state), cost analysis, and single-console ops rationale are well-argued. Four implementation-facing gaps should be addressed before acceptance.

1. job_workflow_ref validation strategy when WIF is gone (High)

The ADR's OIDC validation section (Security §2) lists job_workflow_ref as a fail-closed check, carried over from today. Today's prevalidateOIDCToken() in internal/mint/main.go (lines 597–610) accepts three job_workflow_ref patterns:

  1. {org}/.fullsend/... — org config repo
  2. fullsend-ai/fullsend/... — upstream reusable workflows
  3. {owner}/{repo}/...only if repo is in PER_REPO_WIF_REPOS

PER_REPO_WIF_REPOS today serves dual duty: WIF provider routing AND job_workflow_ref validation. When WIF goes away in the Workers port, the WIF routing purpose disappears — but the ref validation role remains. The ADR should clarify:

  • Does PER_REPO_WIF_REPOS (or an equivalent) survive as a per-repo allowlist for custom workflows?
  • If yes, it's still a per-repo enrollment list that requires mint-side updates — contradicting the "opaque URL" goal for adopters.
  • If no (org-level trust: any repo in an enrolled org can mint if the workflow filename is in ALLOWED_WORKFLOW_FILES), the security implications should be documented.

This matters for custom agent workflows — users bringing their own workflow files (not calling upstream reusable workflows) will hit Case 3 and need explicit registration unless the validation is relaxed.

2. Enrollment simplification for shared apps (Medium)

The ADR inherits ALLOWED_ORGS, per-org ROLE_APP_IDS entries, and per-org PEM copies from the current architecture. For shared public apps:

  • ROLE_APP_IDS: The App ID is identical across all orgs for the same shared app. The current {org/role: appId} keying could simplify to {role: appId} — static config, no per-org updates.
  • PEM secrets: Same PEM key copied under per-org naming (fullsend-{org}--{role}-app-pem). Could be one secret per role.
  • ALLOWED_ORGS: Could be replaced by the natural enrollment gate — findInstallation() (line 715) returns 404 if the app isn't installed on the repo. Installing the shared GitHub App IS enrollment.

The ADR doesn't need to mandate this simplification, but should acknowledge it as a consequence of the shared app model. It affects the Worker secrets layout (fewer secrets) and whether #914 enrollment requires mint-operator involvement at all.

3. Per-repo trust routing without WIF (Low)

The ADR mentions "per-repo policy routing (parity with today's GCF behavior)" in Security §2. Today, per-repo routing means resolveWIFProvider() picks a dedicated WIF provider for repos in PER_REPO_WIF_REPOS. In the JWKS world, there's no WIF provider to route to. What's the equivalent? Is it just the job_workflow_ref Case 3 check, or is there additional per-repo config?

4. Spike: clarify OIDC audience handling in JWKS path (Low)

The spike's STS→JWKS section explains signature verification clearly but doesn't mention aud (audience) validation. Today the OIDC_AUDIENCE check is in application code (line 556), not in WIF — so it carries over unchanged. Worth a sentence confirming this so readers don't assume audience validation was a WIF-side responsibility.

What's well-covered

  • Trust model aligned with ADR 0029
  • JWKS parity requirement (prove STS ≡ JWKS in CI)
  • Isolation from inference/internal infrastructure
  • GitOps deployment requirement
  • PEM rotation deferral to future ADR (appropriate scoping)
  • Blast radius analysis
  • Cost at ~$0 community budget
  • Single-console ops rationale for preferring Scenario 1 or 3 over 2

Recommendation

The hosting decisions and architecture are sound. The gaps above are about documenting the JWKS-world implications for mint-side enrollment config and per-repo custom workflow support. Items 1–2 should be addressed in the ADR text (even as acknowledged open questions or deferred to #914 implementation). Items 3–4 are minor clarifications.

@ifireball

Copy link
Copy Markdown
Member Author

Related to #1145 (zero-GCP hosted-mint install). ADR 0040 defines the steady-state public mint architecture that #1145 depends on.

@rh-hemartin

Copy link
Copy Markdown
Member

How is this going @ifireball @waynesun09 ? Do recent changes impact this?

@github-actions
github-actions Bot deleted the cursor/565c814c branch June 28, 2026 07:04
ifireball and others added 2 commits June 30, 2026 13:26
Signed-off-by: Barak Korren <bkorren@redhat.com>
Renumber to ADR 0061 (0040 taken by org-pool ADR), merge upstream/main,
cross-reference ADR 0059/0060/0044, and fold in trust-policy decisions
that supersede the original OIDC/enrollment wording. Update spike, README,
and architecture.md; annotate ADR 0059 deferred items now covered here.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ifireball

Copy link
Copy Markdown
Member Author

Rebased on main + ADR refresh

Merged upstream/main and pushed updates (386d3cdb).

Numbering

ADR 0040 → 00610040 is now org-pool for parallel e2e tests on main.

What changed since the original draft (and what we dropped/revised)

Original ADR content Status after main
Security §2: three-way job_workflow_ref + PER_REPO_WIF_REPOS for custom workflows Superseded by ADR 0059 — public hosted mint is upstream-only (fullsend-ai/fullsend/.github/workflows/); PER_REPO_WIF_REPOS is tight-mode only
"Org + per-repo install modes" on same public mint Revised — per-org .fullsend deprecated (ADR 0044); public profile targets per-repo installs + upstream reusables
Per-org ROLE_APP_IDS / per-org PEM copies Removed — already decided in ADR 0059 §8 (global per-role credentials)
ALLOWED_ORGS as enrollment gate Replaced — hosted mint uses ALLOWED_ORGS=*; installing shared Apps is enrollment (#1145)
internal/mint as sole code reference Updatedinternal/mintcore/ is the shared library; GCF (internal/mint/), standalone JWKS (cmd/mint/), future Workers all use it
../guides/admin/infrastructure-reference.md Fixed path — moved to docs/guides/infrastructure/
ADR scope: trust policy + infrastructure mixed Split — ADR 0059 = trust policy; ADR 0061 = deployment/ops/edge (fulfills items deferred from 0059)

Still valid unchanged: GCP interim → Workers steady-state phasing, ~$0 cost analysis, isolation from inference, GitOps (#1263), PEM rotation deferred to future ADR, Bootstrap SLO ownership.

Also added docs/spikes/ to README index (review bot note).


@waynesun09 — addressing your review items:

  1. job_workflow_ref / PER_REPO_WIF_REPOS when WIF is gone — Resolved by cross-referencing ADR 0059: public mode does not keep per-repo custom workflow allowlists; provenance is upstream-only. PER_REPO_WIF_REPOS remains for tight/self-managed mints only. Documented explicitly in ADR 0061 "Trust and enrollment" section.

  2. Enrollment simplification for shared apps — Resolved in ADR 0059 (global ROLE_APP_IDS, global PEMs, ALLOWED_ORGS=*, App install = enrollment). ADR 0061 now states hosted mint will use public mode and links feat: default --mint-url to fullsend-ai hosted mint and skip provisioning by default #1145.

  3. Per-repo trust routing without WIF — In public mode there is no per-repo routing equivalent; JWKS path uses the same mintcore claim checks with empty PER_REPO_WIF_REPOS. Clarified in ADR 0061 + spike.

  4. aud in JWKS path — Added to spike OIDC section: OIDC_AUDIENCE is validated in mintcore on both STS and JWKS verifiers, not by WIF.

@rh-hemartin — yes, recent main changes materially affected this PR; see table above. ADR 0059/0060/0044 and mintcore refactor are the big ones.

ifireball and others added 2 commits July 1, 2026 08:35
Signed-off-by: Barak Korren <bkorren@redhat.com>
ADR 0061 was taken by harness-cel-dispatch on main. Merge latest
upstream/main and renumber the community mint architecture ADR.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 5:41 AM UTC · Ended 5:52 AM UTC
Commit: e6b1ae3 · View workflow run →

@codecov

codecov Bot commented Jul 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment component/mint Token mint and cross-boundary credentials and removed ready-for-merge All reviewers approved — ready to merge labels Jul 1, 2026
Revert frozen ADR 0059 sections to main. Document Workers PEM secret
size (~1,675-byte PEMs fit the 5 KB limit), link automated rotation
to fullsend-ai#4175, and warn in mintcore when PEMs exceed the Workers limit.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ifireball
ifireball requested a review from waynesun09 July 12, 2026 06:55
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 12, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:56 AM UTC · Completed 7:15 AM UTC
Commit: ccdb32a · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed ready-for-merge All reviewers approved — ready to merge labels Jul 12, 2026
Renumber community mint ADR 0063→0068 (0063 taken by polling-based work
discovery on main). Resolve VitePress sidebar conflict keeping Spikes.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 13, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 5:49 AM UTC · Ended 6:06 AM UTC
Commit: 2941769 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot removed the requires-manual-review Review requires human judgment label Jul 13, 2026
@ifireball
ifireball requested a review from a team July 13, 2026 07:43
Revert mintcore/cmd/mint PEM size warnings added in ccdb32a. Workers
5 KB limit and current ~1,675-byte PEMs stay documented in ADR 0068.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:47 AM UTC · Completed 8:03 AM UTC
Commit: 2e3d9cf · View workflow run →

@fullsend-ai-review
fullsend-ai-review Bot dismissed their stale review July 13, 2026 08:03

Superseded by updated review

fullsend-ai-review[bot]

This comment was marked as outdated.

Signed-off-by: Barak Korren <bkorren@redhat.com>
@ifireball

Copy link
Copy Markdown
Member Author

Babysit update (Jul 14)

Merged latest main (no conflicts). ADR 0068 number still clear.

May 26 review (@waynesun09) — addressed in current ADR/spike

Item Where addressed
1. job_workflow_ref / WIF ADR 0068 Trust and enrollment: public profile = upstream reusables only; PER_REPO_WIF_REPOS empty; custom {owner}/{repo}/ paths are tight-mode only (self-managed mints). Normative policy in ADR 0059.
2. Enrollment simplification Same section: ALLOWED_ORGS=*, installing shared Apps is enrollment, global per-role ROLE_APP_IDS + PEMs (not per-org).
3. Per-repo trust without WIF PER_REPO_WIF_REPOS unset on hosted mint; no WIF routing on public profile. Per-repo custom workflows → self-managed tight-mode only.
4. aud in JWKS path ADR 0068 §Trust (aud in mintcore); spike §OIDC trust line 39.

Jul 7 Review Squad — all threads resolved

  • ADR renumbered 0068 (0063 = polling-based work discovery on main)
  • ADR 0059 frozen sections restored
  • PEM rotation → #4175
  • Workers PEM size → ADR doc only (~1,675 bytes; no code)
  • JWKS parity CI → #4393 (sub-issue of #1263)

CI green on 2e3d9cf. Re-requesting review.

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 5:55 AM UTC · Completed 6:07 AM UTC
Commit: c057fa2 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed requires-manual-review Review requires human judgment labels Jul 14, 2026
Resolve README conflict by taking main's simplified docs pointer.

Signed-off-by: Barak Korren <bkorren@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:28 PM UTC · Completed 9:39 PM UTC
Commit: 499f015 · View workflow run →

@ifireball
ifireball dismissed waynesun09’s stale review July 14, 2026 21:36

Stale on 5e9cca5; addressed in ADR 0068.

@ifireball
ifireball added this pull request to the merge queue Jul 14, 2026
@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed requires-manual-review Review requires human judgment labels Jul 14, 2026
Merged via the queue into fullsend-ai:main with commit c7724b5 Jul 14, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component/docs User-facing documentation component/mint Token mint and cross-boundary credentials requires-manual-review Review requires human judgment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SPIKE: community token mint on GCP vs Cloudflare port

4 participants