Hosted GitHub Actions are currently unavailable because of the account's billing/spending limit.
Use an explicit manual gate, not a fabricated successful Actions check. GitHub currently reports
main as unprotected with no required status contexts; this is an observation, not permission to
merge without review. Recheck enforcement if repository settings change.
.nvmrc, the root engine declaration and the
Actions workflow use Node22.23.2, matching the observed deployment runtime.npm run verify on a stable candidate. It covers common package checks, Main's Spell profile,
browser/worker journeys and independent packed installations. Do not edit source while a proof
consumes compiled packages from that source.See verification and the review disposition.
Use a separate staging Mongo server and volume instances, and a distinct deployment identity in the private access policy. Verify these boundaries before writes. Do not copy production process data or attachment contents into staging merely to test hosting; use controlled acceptance records/files.
For Main, set PROCESS_APP_CONFIG=applications/main/config/acceptance-no-effects.json in the staging
build/runtime environment. This checked-in file contains public compilation aliases but no effect
provisioning. Workflow HTTP, signing and derivation capabilities fail closed even if unrelated
provider variables exist in the environment. Authentication can still call Auth0. The generic
runtime is unchanged; this is explicit operational provisioning, not a test authentication bypass.
Do not use this configuration for operational production workflows.
The ordinary staging worker must remain stopped while setup occurs. Test a controlled scheduler pass in a separate process only against the staging namespace. Never enable or replay operational effects as a side effect of a smoke test. Keep synthetic JWT fixtures local; hosted acceptance uses the real configured identity provider, not a publicly deployed synthetic signing authority.
Required evidence: hosted install/build/start, real login/callback at each selected origin, declared app/operator boundaries, anonymous/invalid-token denial, controlled file upload/read/denial, persistence after restart and controlled worker progression. Record anything that needs human login rather than guessing acceptance from a200 landing page.
The current four-service mapping can be retained without creating a new platform service:
| Railway service | Role after cutover | Build / start |
|---|---|---|
| process-platform | Main operator UI + canonical authenticated API + file-volume owner | npm run build / npm start |
| Risk Assessment | Independent Allocation Risk frontend, proxying canonical API | npm run build:packages && npm run build:app --workspace @processos/allocation-risk / npm run start --workspace @processos/allocation-risk |
| Spell Risk | Independent Spell frontend, proxying canonical API | npm run build:packages && npm run build:app --workspace @processos/spell-review / npm run start --workspace @processos/spell-review |
| Step Runner | Exactly one worker on the canonical Mongo deployment | npm run build:packages / npm run job:step |
Frontend server proxies use PROCESS_BACKEND_ORIGIN; browsers continue using their own same-origin
/api endpoints. Set each peer frontend's PROCESS_APPLICATION_ID to its declared application id (trusted
list scope). Configure fixed PROCESS_AUTH_MOUNT_ID values on peer frontends and matching
PROCESS_AUTH_MOUNTS on the backend. Auth0 must allow each frontend's callback/web/logout origin.
Frontend public-base settings must be its actual origin, not localhost or another environment.
Only canonical backend/worker hosts need Mongo, deployment policy and provider capability bindings; peer frontends must not initialize an alternate backend or independent writable file store. Transfer reviewed referenced attachments to the canonical file volume at cutover. Preserve unresolved legacy bytes separately. Names and exact instance IDs belong in private operator evidence, not this handbook.
Put the reviewed access JSON in a private file on each relevant backend/worker host and set
PROCESS_ACCESS_CONFIG to its path. Large policies should not be placed in a single oversized
environment value. A persistent volume can hold the file under a separate configuration directory;
keep it outside the attachment root and permission it0600. Verify its hash after transfer. Do not
commit the real membership list or credentials. The policy is read lazily at runtime, not during build.
Provision two distinct persistent protected-effect keys where signing/derived handles are used. Services sharing protected handles need the same keyring. Supply secrets through protected runtime configuration, never CLI argument literals, documentation, logs or checked-in files. Verify presence and consistency without displaying values. The no-effects staging configuration does not establish production provider readiness.
Automatic GitHub deployment can stay configured if maintainers control the merge. Do not add a blanket disconnect/reconnect procedure merely because checks are unavailable. Instead, make merge the final release signal after the migration prerequisites are satisfied:
If these prerequisites are not complete, the PR may be code-review-ready but it is not yet time to click Merge. Holding auto-deploy is an alternative if maintainers later need to merge before the window, not a substitute for migration ordering. See cutover for create-only import and rollback. Code rollback cannot undo new database writes or external actions.