Soul S4: the Bifrost handoff notes, the Bifrost profile and the service contract still named plaintext secret variables; each now names the _FILE credential path. .env.example and the Spotiverse profile taught GC_ACCESS_APP_SPOTIVERSE_SHARED_SECRET_FILE, which nothing reads: spotiverse is not in appSlugs. Both lines are removed rather than adding the slug. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.2 KiB
Bifrost App Profile
Bifrost uses Heimdall for shared GameCult membership signals while keeping Bifrost-domain state local.
Ownership
Heimdall owns:
- Discord and Patreon OAuth
- provider token custody and refresh
- Discord role entitlement evaluation
- Patreon tier entitlement evaluation
- Patreon membership profile reads used for Bifrost support sync
- signed delivery of normalized patron support facts to Bifrost
- signed app claims and backend handoff delivery
Bifrost owns:
- local
UserAccountand membership records - work, motions, ledgers, patron support events, and governance weight
- the decision to turn a Heimdall member-access claim into active Bifrost membership
- provider-derived patron credit rules and receipt projection
Current Access Policy
Bifrost accepts two Heimdall entitlement policies:
- Discord role access for the GameCult guild, with the deployment supplying the KTLST/cult-member role id as the allowed role.
- Patreon membership access for the configured support tier title, currently
Inner Sanctumby default.
Both policies are caller-owned by Bifrost and must use backend_callback
handoff. Browser-completion handoffs must not carry app-owned entitlement
policies because a browser caller could forge the policy.
Runtime Flow
- Bifrost creates an auth attempt and asks Heimdall to start Discord or Patreon OAuth with a server-owned entitlement policy.
- Heimdall completes provider OAuth, evaluates the entitlement, and delivers
the result to
https://bifrost.gamecult.org/auth/heimdall/callback. - Bifrost's browser waits at
/auth/heimdall/wait. - When the callback arrives, Bifrost creates or updates its local user account, activates standard membership, and issues its own app cookie.
Heimdall does not own Bifrost ledgers, patron points, votes, payout proposals, or work routing.
Patron Support Sync
Bifrost patronage uses the same linked Patreon identity and membership reader as the Repixelizer entitlement path. There is not a second Patreon parser in Bifrost.
POST /v1/apps/bifrost/patron-support/sync is an app-authenticated Heimdall
backend route. Bifrost or an operator job calls it with:
accountId: the Heimdall account already linked through Patreon OAuthrequiredTierTitle: the Bifrost support tier title, usuallyInner Sanctum- optional
currencyCodeandsupportedAtUtcfallback values
Heimdall refreshes the stored Patreon credential if needed, fetches the Patreon
identity profile with memberships and currently entitled tiers, finds an active
paid membership for the requested tier title, and POSTs a signed
RecurringSupportSnapshot fact to Bifrost's
/heimdall/patron-support/events endpoint.
The outbound fact uses X-Heimdall-Signature-256 with the shared secret
Heimdall reads from GC_ACCESS_BIFROST_PATRON_SUPPORT_SECRET_FILE. Bifrost
verifies that HMAC, resolves the Heimdall account id to its local user account,
deduplicates by provider event id, records the support event, and derives
patron points locally.
This route is a bridge from auth-owned Patreon evidence to Bifrost-owned governance meaning. Heimdall still does not own points, votes, tiers, ledger history, or payout policy.