Platform modules
Developer workflows with state that can be explained.
Forge is deliberately designed around the moments where collaboration systems usually become risky: access changes, external events, reviews, pipelines, and the final merge.
01 / ACCESSOrganizations, teams & roles
Email/password accounts use bcrypt hashes; session cookies are HttpOnly, SameSite, and expire after twelve hours. Organization roles are inherited by projects, while project roles can raise—but never weaken—existing access. The model protects the final organization owner and stops archived projects from accepting work mutations.
02 / WORKProjects, issues & milestones
Teams create and own projects with issues that can be searched by title, description, or ID, then combined with status, assignee, label, and milestone filters. Sort by date or title, with project filters retained during the session. Milestones track due dates and completion progress, expose their open issues, and can be closed or reopened. The relational model keeps this workflow structured instead of treating the dashboard as an unfiltered activity feed.
03 / REVIEWProvider-backed merge requests
GitHub and GitLab authorization-code OAuth uses state validation and PKCE. Imported repository metadata stays connected to its provider; Forge can link an existing remote request, load its diff, collect line comments and review decisions, then fetch fresh remote state before allowing a merge attempt.
04 / POLICYMerge gates & pipeline state
Approvals are invalidated by a new head commit, authors cannot approve their own work, and provider identities count once. Required approvals, resolved review discussions, current provider CI, and mergeability form the real gate. Forge’s queued → running → passed/failed pipelines are simulations—not hosted CI runners—and demonstrate persisted state recovery and incremental logs.
05 / INTEGRATEExternal events without blind trust
GitHub webhooks are validated with HMAC-SHA256; GitLab deliveries use a secret token. Deliveries are persisted per project to prevent reprocessing and linked merge requests are flagged for refresh rather than overwritten by an out-of-order payload. This matters because a webhook is a useful signal, but it is not automatically the final authority on a provider’s state.
- OAuth / PKCERepository import starts with provider authorization, state checks, and a PKCE verifier.
- Webhook guardEach delivery is authenticated and deduplicated before it can affect project state.
- Provider truthRefresh, diff loading, review submission, and merging fetch provider state again.
06 / TRACELive state, activity & auditability
Authenticated server-sent events deliver live changes with heartbeats and client reconnect behavior. Normal activity records describe the project timeline; sensitive operations—such as membership changes, settings, imports, approvals, merges, and webhook-secret rotation—also write to a separate hash-linked audit log. PostgreSQL triggers reject edits or deletions to those event tables, preserving append-only behavior below the application layer.