- C# 64.4%
- JavaScript 29.9%
- HTML 4.9%
- CSS 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
With discord-dm gone the verb set, listCommandRecords filter, resolveBridgeVerb throw and the verb variable decided nothing, and the filter hid non-discord-post commands so they stayed pending with no receipt. Delete all of it: a command whose verb is not discord-post now reaches processOneCommand and is refused with a failed receipt (error names no input value). Payload staging moves inside the try so a refusal cannot escape as a thrown error. Adds tests/cultmesh-bridge-commands.test.mjs: discord-dm refused with failed receipt and non-ok result, canary-free error, discord-post still reaches the actuator. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
| .agents/plugins | ||
| .github/workflows | ||
| docs | ||
| plugins/bifrost-intake | ||
| src/Bifrost.Web | ||
| tests | ||
| tools | ||
| .dockerignore | ||
| .env.local.example | ||
| .gitignore | ||
| AGENTS.md | ||
| Bifrost.slnx | ||
| CLAUDE.md | ||
| compose.local.yaml | ||
| Dockerfile | ||
| README.md | ||
Bifrost
Bifrost is the planned GameCult member, governance, labor, and public-process platform running under the Yggdrasil infrastructure umbrella. It exists to connect projects, users, patrons, contributors, motions, ledgers, work requests, reward pressure, public receipts, and operational decisions in one place instead of leaving them scattered across GitHub, docs, chat, and human memory.
Bifrost also owns the governed transport layer for GameCult work that crosses public or collaboration protocols: GitHub proposal/review surfaces, Discord-native work and swarm interfaces, Reddit organizing threads in r/GameCultOrg, CultNet/CultCache intake packets, and future collaboration interfaces. That bridge role follows from the Labor Platform role; it is not a separate bot utility. See docs/jurisdiction-map.md.
Status
This repository now includes a viable alpha foundation slice of the ASP.NET Core app:
- Razor Pages app under
src/Bifrost.Web - PostgreSQL-backed EF Core model with an initial migration under
src/Bifrost.Web/Data/Migrations - Bifrost-native identity registration plus GitHub OAuth and Heimdall-linked provider identities, with invite/approval-based membership gating
- explicit member roles and admin-managed patron or contributor tier snapshots
- patron support event recording with derived patron point summaries and tier refresh for voting weight
- shared work board with estimates, actual time logs, review flow, and GitHub issue or PR links
- planned priority/reward pressure loop where demand can raise a work item's value before a contributor claims it
- member-facing motions with category thresholds aligned to the labor-platform doc
- health and readiness endpoints plus startup config validation
- GitHub App webhook ingestion for issue, pull request, and review sync
- Heimdall-signed external patron support intake for Patreon and PayPal support facts
- Eve Motion Verse surface and command endpoint for governance participation, with Razor motion forms demoted to a transitional browser lowering
- local bridge tooling for agent-owned GitHub draft PRs and PR comments, Discord posts and DMs, Reddit self-posts, and fail-closed future-surface request probes
- canonical
bifrost.crossing_receipt.v1history in.bifrost/bridge-receipts.ccfor GitHub, Discord, Reddit, governance, and agent-transport crossings - local bridge tooling for Reddit self-posts in
r/GameCultOrg, including Persona flair labels through the Bifrost Reddit app - CultCache-backed governance topic threads for feature requests, discussion comments, Persona approvals, and dispatch promotion
- CultCache/CultNet-backed agent intake tooling for repo Persona update requests
- a Verse service contract for CultCache witnesses, CultMesh namespaces, and Eve/CultUI product and operator surfaces
- a read-only Eve provider advertisement export command for Bifrost Verse surface discovery
- Docker image and local Compose stack for containerized smoke testing
- xUnit integration tests under
tests/Bifrost.Web.Tests - matching deploy artifacts and runbooks in
E:\Projects\gamecult-ops
It is closer to deployable now, but it is still not a finished internet-facing member alpha. The current state is suitable for a private deploy candidate on Yggdrasil while we finish the remaining operational hardening and post-MVP economics work.
Chosen Stack
- ASP.NET Core 8 LTS
- Razor Pages + HTMX
- PostgreSQL
- Bifrost-native identity registration
- GitHub OAuth for linked sign-in and repository integration
- GitHub App for issue and pull request integration
Alpha Scope
- invite-only member portal
- Bifrost identity registration without OAuth; membership remains invite/approval gated
- GitHub and Heimdall-linked provider accounts as external identities
- GitHub-backed and internal work items
- app-native motions and voting
- internal ledgers for patronage, contribution, point evidence, and payout eligibility
- no real payout execution in v1
Hosting Target
- public app hostname:
bifrost.gamecult.org - infrastructure context:
Yggdrasil - deployment model: GHCR image + Docker Compose behind nginx, with the older systemd path kept as rollback until the container path is boring
Next Build Target
The next build target is to deepen the alpha candidate by adding:
- GitHub App installation/admin guidance and live webhook verification against the real repo
- richer workflow polish around work review, blocking, and closure ergonomics
- payout proposal batch generation and tighter ledger approval workflow
- staged deploy validation on Yggdrasil, including backup/restore rehearsal
- post-MVP economics automation for point transactions, decay, and revenue-share calculation
For the full staged roadmap, including contribution points, revenue share, patron or contributor decay, and labor-platform alignment, see docs/full-implementation-strategy.md.
Local Dev Notes
- set
GitHubOAuth:ClientIdandGitHubOAuth:ClientSecretbefore using sign-in - POST
/auth/bifrost/registerwithidentity, optionaldisplayName, and optionalreturnUrlto create a Bifrost-native account without OAuth; this signs in asAuthenticatedbut does not grant active member access - set
Bootstrap:AdminGitHubLoginswith at least one GitHub login for the first active admin path - HTTP bridge ledger configuration (
BIFROST_BRIDGE_BASE_URL/BIFROST_BRIDGE_TOKEN) is removed from live CLI transport. Request-lane, governance, dispatch, and bridge receipts converge on Bifrost-ownedbifrost.crossing_receipt.v1documents in.bifrost/bridge-receipts.cc. - external bridge actions must carry typed CultMesh command provenance such as
BIFROST_CULTMESH_COMMAND_ID; unreceipted and HTTP-ledger hatches fail closed. - Persona and agent public crossings still require Bifrost identity, Heimdall capability/account reference, and Epiphany provenance, but those facts travel with typed command/receipt documents rather than a local HTTP bridge token.
- Bifrost-dispatched Codex turns also inject Bifrost-owned GitHub gates through environment config:
gitandghwrappers are prepended inPATH, apre-pushhook backs up raw Git pushes, rawgit pushstays blocked, and directghusage is limited to explicit read-only commands unlesstools/bifrost-bridge.mjsauthorizes the bridge-owned GitHub write path - dispatched Codex turns now default to
workspace-writeinstead of full machine access, and the app-server sandbox policy disables network access unless the operator explicitly chooses a broader sandbox tools/agent-transport.mjsrecords queue, claim, release, close, and snapshot activity in the typed request-lane store.tools/governance-threads.mjsrecords topic opens, comments, approvals, and promotions in the typed governance store.- GitHub bridge mutations now fail closed without typed CultMesh command provenance; ungated and HTTP-ledger hatches are removed.
- dispatched Codex turns inherit the same invariant: a worker cannot downgrade itself out of Bifrost gate or receipt policy
- dispatched Codex turns also now scrub ambient GitHub auth state from the child environment:
GH_TOKEN/GITHUB_TOKENare cleared,ghgets an isolated config directory,gitgets an isolated global config plus non-interactive credential settings, and terminal prompting is disabled before the worker starts - set
BIFROST_REDDIT_CLIENT_ID,BIFROST_REDDIT_REFRESH_TOKEN, and optionallyBIFROST_REDDIT_CLIENT_SECRETbefore posting Reddit organizing threads - set
Heimdall:PatronSupportIntakeSecretbefore enabling Heimdall patron support intake in production - default connection string points at local PostgreSQL
- build with
dotnet build Bifrost.slnx - test with
DOTNET_ROLL_FORWARD=Major dotnet test Bifrost.slnxif the machine only has the .NET 10 runtime installed - dry-run a Reddit organizing thread with
node tools/bifrost-bridge.mjs reddit-post --title "Thread title" --persona-name Bifrost --content "Thread body" --dry-run true - print the Eve provider advertisement with
node tools/provider-advertisement.mjs print - export the Eve provider store with
node tools/provider-advertisement.mjs export --out .bifrost/provider-store.cc - provider advertisement commands require explicit
BIFROST_ROOT_VERSEandBIFROST_MACHINE_IDdeployment identity - inspect the interactive Motion Verse surface at
/eve/governance/surfacewhile signed in as an active member - container smoke test with
docker compose -f compose.local.yaml up --build - container smoke tests may hit
/healthzand/readyzas product probes. Provider advertisements, Docker health, and deploy gates must come from Bifrost's typed CultMesh/Idunn operator state;BIFROST_HEALTH_URLandBIFROST_READY_URLare not accepted by the provider exporter.
Read First
Before implementation work starts in a new session, read these files in order: