Skip to content

fix(railway): restore runner and mount connectivity - #5485

Open
mmabrouk wants to merge 2 commits into
mainfrom
fix/railway-runner-private-bind-main
Open

fix(railway): restore runner and mount connectivity#5485
mmabrouk wants to merge 2 commits into
mainfrom
fix/railway-runner-private-bind-main

Conversation

@mmabrouk

@mmabrouk mmabrouk commented Jul 24, 2026

Copy link
Copy Markdown
Member

Context

Railway previews had two failures in the agent workflow. Agent requests could not reach the runner because it listened only on its container loopback address. Mount file requests returned 503 Service Unavailable because the deployment wrote empty SeaweedFS access and secret keys to every service.

The Railway health checks did not catch either failure. The runner could answer its own container health check, and the API acceptance tests skipped mount tests when storage returned 503.

Changes

The Railway runner now binds to 0.0.0.0, so services can reach it through Railway private networking. The existing shared AGENTA_RUNNER_TOKEN still authenticates those requests.

configure.sh now treats the API service as the durable copy of the mount-storage credentials:

  • Explicit operator values still take precedence.
  • Existing Railway values are reused during redeployments.
  • A fresh project generates only the missing access, secret, signing, and JWT keys.
  • The same resolved values are written to API, SeaweedFS, services, and runner before those services deploy.

Before this change, a fresh preview stored empty access and secret keys, and every configure run rotated the signing and JWT keys. After this change, a fresh preview configures working storage automatically, while later redeployments keep the same credentials.

The Railway API test job now requires mount storage. A 503 fails the mount acceptance tests in Railway instead of silently skipping them. Other environments can still skip these tests when mount storage is intentionally absent.

How to review

  1. Start with hosting/railway/oss/scripts/configure.sh. Review the credential precedence and confirm resolution happens after Railway linking but before service variables are written.
  2. Review the runner host changes in the Railway Dockerfiles and configure script.
  3. Review the shared mount-test helper and the Railway-only requirement in .github/workflows/44-railway-tests.yml.
  4. Confirm deploy-from-images.sh configures credentials before restarting SeaweedFS and deploying API, services, and runner.

Verification

  • ruff format . and ruff check --fix . in api
  • bash -n for the Railway configure, image-deploy, and smoke scripts
  • Parsed .github/workflows/44-railway-tests.yml as YAML
  • Collected all 34 affected mount acceptance tests successfully
  • git diff --check
  • Pre-commit and pre-push hooks, including gitleaks

The Railway preview workflow will provide the end-to-end verification after this revision deploys.

What to QA

  • Run a model from the Railway preview playground. The request completes without a runner connection error.
  • Create or open a session mount and list its files. The endpoint returns 200 instead of 503.
  • Write a file, redeploy the same preview, and list or read the file again. The file remains available because the deployment reused the existing store credentials.
  • Confirm the Railway mount acceptance tests run rather than report storage-related skips.

@dosubot dosubot Bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Jul 24, 2026
@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Ready Ready Preview, Comment Jul 24, 2026 10:41pm

Request Review

@dosubot dosubot Bot added the devops label Jul 24, 2026
@mmabrouk mmabrouk added the needs-review Agent updated; awaiting Mahmoud's review label Jul 24, 2026 — with ChatGPT Codex Connector
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

No new commits to review since the last review.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cf9cf98d-e6f5-4c32-88cb-e1ccd93cd06a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Railway deployment now reuses or generates mount-store credentials, configures runners to bind on all interfaces, and applies shared HTTP 503 handling for mount-storage acceptance tests, with CI configured to require mount storage.

Changes

Railway mount storage and runner configuration

Layer / File(s) Summary
Resolve and reuse mount-store credentials
hosting/railway/oss/scripts/configure.sh, hosting/railway/oss/README.md
Configuration reads existing Railway store variables, preserves explicit values, generates missing credentials, and documents the behavior.
Gate mount-storage acceptance tests
api/oss/tests/pytest/acceptance/mounts/*, api/oss/tests/pytest/utils/mounts.py, .github/workflows/44-railway-tests.yml
Mount tests use shared HTTP 503 handling; required environments fail while other environments skip unavailable mount-storage checks.
Configure runner host binding
hosting/railway/oss/runner/Dockerfile, hosting/railway/oss/scripts/configure.sh, hosting/railway/oss/scripts/deploy-from-images.sh
Runner Dockerfiles and Railway service variables set AGENTA_RUNNER_HOST to 0.0.0.0 while retaining the existing port configuration.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 60.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title matches the main changes: Railway runner networking and mount connectivity fixes.
Description check ✅ Passed The description is directly aligned with the changeset and explains the Railway connectivity and mount-storage fixes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/railway-runner-private-bind-main

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says:

Verified the fix with Bash syntax checks and an isolated two-container network test: the loopback bind is unreachable from a peer, while the private-network bind returns the runner protocol health payload.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

@mmabrouk I’ll review the Railway runner networking changes and the cross-service smoke-check coverage.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e8f2c5b4-fce7-4947-85bb-8ce23a29bfea

📥 Commits

Reviewing files that changed from the base of the PR and between 7b971d8 and 5eae8a7.

📒 Files selected for processing (4)
  • hosting/railway/oss/runner/Dockerfile
  • hosting/railway/oss/scripts/configure.sh
  • hosting/railway/oss/scripts/deploy-from-images.sh
  • hosting/railway/oss/scripts/smoke.sh

Comment thread hosting/railway/oss/scripts/smoke.sh Outdated
Comment on lines +137 to +139
if railway ssh --service services --environment "$ENV_NAME" \
python -c "import os, urllib.request; url = os.environ.get(\"AGENTA_RUNNER_INTERNAL_URL\", \"\").rstrip(\"/\") + \"/health\"; response = urllib.request.urlopen(url, timeout=5); raise SystemExit(0 if response.status == 200 else 1)" \
>/dev/null; then

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -eu
: "${ENV_NAME:?}"
: "${RAILWAY_SSH_IDENTITY_FILE:?}"
command -v timeout
test -r "$RAILWAY_SSH_IDENTITY_FILE"

timeout 15s railway ssh \
  --identity-file "$RAILWAY_SSH_IDENTITY_FILE" \
  --service services \
  --environment "$ENV_NAME" \
  true

Repository: Agenta-AI/agenta

Length of output: 204


🏁 Script executed:

#!/usr/bin/env bash
set -eu

echo "== script excerpt =="
sed -n '110,155p' hosting/railway/oss/scripts/smoke.sh

echo
echo "== railway ssh references =="
rg -n "railway ssh|RAILWAY_SSH_IDENTITY_FILE|MAX_WAIT_SECONDS|ssh" hosting/railway/oss/scripts/smoke.sh .github hosting/railway 2>/dev/null | head -200

echo
echo "== local git status/stat =="
git diff --stat || true
git status --short || true

Repository: Agenta-AI/agenta

Length of output: 3690


🌐 Web query:

Railway CLI ssh --no-host-check --identity-file first use key registration timeout

💡 Result:

If you are experiencing issues with the Railway CLI SSH key registration or connectivity—such as timeouts, "Unauthorized" errors, or registration failures—there are several known behaviors and troubleshooting steps to resolve the issue. Regarding your specific mention of SSH key registration timeouts and flags: - Railway CLI SSH behavior: The Railway CLI's railway ssh command often requires local public key files to be present on disk (typically in ~/.ssh/ with a .pub extension) to register or identify your key [1]. It does not always automatically consult ssh-agent, which can lead to registration or authentication failures if your keys are only agent-resident [1]. - Manual SSH alternative: As of mid-2026, Railway supports standard native SSH connections [2][3]. If the CLI command fails, you can often bypass it by using the standard SSH client directly: ssh <user>@ssh.railway.com`` [2]. This method is generally more reliable as it natively supports ssh-agent, `~/.ssh/config` files, and standard SSH features [2]. - Troubleshooting "Unauthorized" or registration errors: - Ensure you are logged in via `railway login` [4]. Do not use a project-scoped `RAILWAY_TOKEN` for SSH, as SSH key management is not supported with these tokens [5][4]. Use an account-level session or a workspace-scoped `RAILWAY_API_TOKEN` [5][4]. - Verify your key is registered by running `railway ssh keys list` [6][4]. - If you are on a container that lacks a shell (e.g., `/bin/sh` or `/bin/bash`), `railway ssh` will fail, often returning "Connection closed" or "executable not found" errors [6]. Ensure your container base image includes a shell [6]. - For intermittent "deadline has elapsed" or connection timeouts, these are frequently attributed to network-specific issues or ISP restrictions on WebSocket connections, rather than the Railway platform itself [7]. If you are trying to force a specific identity file, you can use the `-i` flag with `railway ssh`, but ensure the corresponding public key file exists on your machine if you are relying on the CLI's internal registration logic [1][6][4]. For the most reliable results, especially when dealing with complex SSH configurations, prefer using the standard `ssh` client directly [2][3].

Citations:


🏁 Script executed:

#!/usr/bin/env bash
set -eu

echo "== smoke script environment/defaults =="
sed -n '1,35p' hosting/railway/oss/scripts/smoke.sh

echo
echo "== workflow env around smoke runner =="
sed -n '90,120p' .github/workflows/43-railway-deploy.yml

echo
echo "== Railway CLI ssh documentation references in repo =="
rg -n "Railway|railway|first.*key|register|ssh" README.md .github hosting/railway 2>/dev/null | head -200

Repository: Agenta-AI/agenta

Length of output: 26538


Bound and make the new railway ssh probe non-interactive.

The Python timeout=5 only applies after the SSH session is established; this can still block the loop indefinitely if the Railway CLI hangs during SSH connection/authentication or first-use key registration. Use a non-interactive CI key and wrap the invocation in a bounded timeout.

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Railway Preview Environment

Preview URL https://gateway-production-8417.up.railway.app/w
Project agenta-oss-pr-5485
Image tag pr-5485-4e43c86
Status Deployed
Railway logs Open logs
Workflow logs View workflow run
Updated at 2026-07-24T23:35:04.322Z

@mmabrouk
mmabrouk force-pushed the fix/railway-runner-private-bind-main branch from 5eae8a7 to d326b91 Compare July 24, 2026 21:37
@dosubot dosubot Bot added size:XS This PR changes 0-9 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Jul 24, 2026
@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says:

Amended after diagnosing the failed preview workflow:

  • Removed the newly introduced railway ssh cross-service smoke check. It failed because the GitHub Actions runner had no Railway SSH key, and it was not required to fix the product bug.
  • Kept the three Railway-only AGENTA_RUNNER_HOST=0.0.0.0 additions that make the runner reachable from services over the private network.
  • Updated the PR description to match the narrowed scope.

Focused shell syntax, whitespace, pre-commit, pre-push, and remote-SHA checks pass. The replacement Railway preview run is now in progress.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

@mmabrouk I’ll review the latest narrowed Railway runner networking changes, including the removal of the SSH smoke check.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says:

Final verification is complete. The replacement Railway preview workflow passed end to end: image builds, environment setup, deploy, readiness, and every API, SDK, services, and web unit/integration/acceptance suite are green.

Workflow: https://github.com/Agenta-AI/agenta/actions/runs/30128388088

The PR remains needs-review and contains only three one-line Railway host bindings.

@mmabrouk mmabrouk added implementing Design approved; implementation queued/in progress (not awaiting review) and removed needs-review Agent updated; awaiting Mahmoud's review labels Jul 24, 2026
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:XS This PR changes 0-9 lines, ignoring generated files. labels Jul 24, 2026
@mmabrouk mmabrouk changed the title fix(railway): expose runner on the private network fix(railway): restore runner and mount connectivity Jul 24, 2026
@mmabrouk mmabrouk added needs-review Agent updated; awaiting Mahmoud's review and removed implementing Design approved; implementation queued/in progress (not awaiting review) labels Jul 24, 2026
@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says:

I amended this PR after the Railway preview exposed a second deployment failure:

  • configure.sh now reuses existing mount-storage credentials and generates only missing values for a fresh project.
  • API, SeaweedFS, services, and runner receive the same resolved credentials before redeployment.
  • Signing and JWT keys no longer rotate on every configure run.
  • Railway mount acceptance tests now fail on storage 503 responses instead of skipping them.

Local formatting, linting, shell syntax, YAML parsing, and collection of all 34 affected mount tests pass. The new Railway preview run is the end-to-end check.

@mmabrouk

Copy link
Copy Markdown
Member Author

🤖 The AI agent says: @coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

@mmabrouk I’ll review the latest Railway deployment and mount-storage credential changes.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 291c4d10-fd0c-4f66-b023-fd16a701d429

📥 Commits

Reviewing files that changed from the base of the PR and between d326b91 and 1771252.

📒 Files selected for processing (7)
  • .github/workflows/44-railway-tests.yml
  • api/oss/tests/pytest/acceptance/mounts/test_agent_mounts_basics.py
  • api/oss/tests/pytest/acceptance/mounts/test_mounts_basics.py
  • api/oss/tests/pytest/acceptance/mounts/test_mounts_injection.py
  • api/oss/tests/pytest/utils/mounts.py
  • hosting/railway/oss/README.md
  • hosting/railway/oss/scripts/configure.sh

Comment on lines +60 to +82
api_variables="$(railway_call variable list --json --service api --environment "$ENV_NAME")"
if ! jq -e 'type == "object"' >/dev/null 2>&1 <<<"$api_variables"; then
printf "Unable to read existing mount storage configuration from the Railway API service.\n" >&2
return 1
fi

if [ -z "$AGENTA_STORE_ACCESS_KEY" ]; then
AGENTA_STORE_ACCESS_KEY="$(_store_variable_from_json "$api_variables" AGENTA_STORE_ACCESS_KEY)"
fi
if [ -z "$AGENTA_STORE_SECRET_KEY" ]; then
AGENTA_STORE_SECRET_KEY="$(_store_variable_from_json "$api_variables" AGENTA_STORE_SECRET_KEY)"
fi
if [ -z "$AGENTA_STORE_SIGNING_KEY" ]; then
AGENTA_STORE_SIGNING_KEY="$(_store_variable_from_json "$api_variables" AGENTA_STORE_SIGNING_KEY)"
fi
if [ -z "$AGENTA_STORE_JWT_PRIVATE_KEY" ]; then
AGENTA_STORE_JWT_PRIVATE_KEY="$(_store_variable_from_json "$api_variables" AGENTA_STORE_JWT_PRIVATE_KEY)"
fi

AGENTA_STORE_ACCESS_KEY="${AGENTA_STORE_ACCESS_KEY:-$(openssl rand -hex 10)}"
AGENTA_STORE_SECRET_KEY="${AGENTA_STORE_SECRET_KEY:-$(openssl rand -hex 32)}"
AGENTA_STORE_SIGNING_KEY="${AGENTA_STORE_SIGNING_KEY:-$(openssl rand -base64 32)}"
AGENTA_STORE_JWT_PRIVATE_KEY="${AGENTA_STORE_JWT_PRIVATE_KEY:-$(openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 2>/dev/null)}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== files =="
git ls-files | rg '(^|/)hosting/railway/oss/(scripts/configure\.sh|README\.md)$|configure\.sh|README\.md' || true

echo
echo "== configure.sh relevant section =="
if [ -f hosting/railway/oss/scripts/configure.sh ]; then
  nl -ba hosting/railway/oss/scripts/configure.sh | sed -n '1,140p'
fi

echo
echo "== README relevant section =="
if [ -f hosting/railway/oss/README.md ]; then
  nl -ba hosting/railway/oss/README.md | sed -n '1,100p'
fi

echo
echo "== railway variable access helper usages =="
rg -n "railway_call variable|_store_variable_from_json|AGENTA_STORE_.*KEY|AGENTA_STORE_JWT_PRIVATE_KEY|variable list --json" hosting/railway/oss -S || true

Repository: Agenta-AI/agenta

Length of output: 10572


🌐 Web query:

Railway variables sealed variables CLI variable list omitted environment variables documentation

💡 Result:

In Railway, environment variables can be managed via the dashboard UI, the CLI, and the public GraphQL API [1][2][3]. Sealed Variables Sealed variables are a security feature designed to prevent sensitive values from being read back after they are set [4][5]. When a variable is sealed: - The value remains available to your application at runtime and during the build process as a standard environment variable [4][5]. - The value is never visible in the Railway dashboard UI [4][5]. - The value cannot be retrieved via the Public API [4][5]. - There is currently no CLI command or API mutation to create or seal a variable; this action must be performed manually in the Railway dashboard UI using the variable's 3-dot menu [6]. CLI Variable Management The Railway CLI provides command-line access to manage variables for your services [2][7]. You can use the railway variable (or railway var / railway vars) command to interact with your variables [2]: - List variables: railway variable list [2][8] - Use -s or --service to target a specific service [2][9]. - Use -e or --environment to target a specific environment [2][9]. - Use --kv to output in KEY=VALUE format [2][8]. - Use --json to output in JSON format [2][8]. - Set a variable: railway variable set KEY=VALUE [2][7] - Delete a variable: railway variable delete KEY [2][7] Note that when listing variables via the CLI, if a variable is "sealed," its value will not be returned or displayed, ensuring the security of the secret [8]. Additionally, ensure you are authenticated and have linked your project to use these commands [1].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate candidate files =="
printf '%s\n' "hosting/railway/oss/scripts/configure.sh" "hosting/railway/oss/README.md"
if [ -f hosting/railway/oss/scripts/configure.sh ]; then
  python3 - <<'PY'
from pathlib import Path
p=Path('hosting/railway/oss/scripts/configure.sh')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 1 <= i <= 140:
        print(f"{i:5d}\t{line}")
PY
fi
echo
if [ -f hosting/railway/oss/README.md ]; then
  python3 - <<'PY'
from pathlib import Path
p=Path('hosting/railway/oss/README.md')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 1 <= i <= 100:
        print(f"{i:5d}\t{line}")
PY
fi

echo
echo "== search credential handling =="
python3 - <<'PY'
import subprocess
patterns = [
    "railway_call variable",
    "_store_variable_from_json",
    "AGENTA_STORE_ACCESS_KEY",
    "AGENTA_STORE_SECRET_KEY",
    "AGENTA_STORE_SIGNING_KEY",
    "AGENTA_STORE_JWT_PRIVATE_KEY",
    "variable list --json"
]
for pat in patterns:
    print(f"\n-- {pat!r} --")
    subprocess.run(["grep", "-n", "-R", "-S", pat, "hosting/railway/oss"], text=True)
PY

Repository: Agenta-AI/agenta

Length of output: 12540


🌐 Web query:

Railway docs variables sealed variables value cannot be retrieved via the Public API CLI variable list omit sealed values

💡 Result:

In Railway, sealed variables are intentionally designed to be write-only for security reasons [1][2]. Because of this, their values cannot be retrieved or displayed via the Public API or the Railway CLI [1][2]. When you list variables using the Railway CLI (e.g., via railway variable list or railway run), sealed variables are omitted from the output [1][2]. Similarly, the Public API will not return the values of these variables in any response [2][3]. Railway injects these values directly into your builds and deployments at runtime, ensuring they remain protected from visibility in the dashboard UI, API responses, or CLI commands [1][2][4]. Because sealing is a permanent, one-way security measure, you cannot unseal a variable once it has been set [1][2]. If you need to access a secret value locally for development that is also used as a sealed variable in production, the recommended practice is to maintain a separate, non-sealed variable for your local development environment [1][2].

Citations:


Preserve sealed mount-store credentials instead of regenerating them.

Railway does not return sealed variable values from the CLI/API, so _store_variable_from_json treats them as absent and the script generates replacements. That violates the documented reuse behavior and can rotate credentials for an existing deployment. Distinguish “sealed exists” from “missing” by requiring explicit overrides or persisting credentials outside Railway for future configure.sh runs.

📍 Affects 2 files
  • hosting/railway/oss/scripts/configure.sh#L60-L82 (this comment)
  • hosting/railway/oss/README.md#L63-L66

@mmabrouk

Copy link
Copy Markdown
Member Author

Amendment verification update:

  • Commit 17712520d3 is pushed and the worktree is clean.
  • Local validation passed: full API Ruff format/check, affected mount-test collection (34 tests), shell syntax, workflow YAML parsing, git diff --check, pre-commit, and pre-push checks.
  • I reran the Railway preview workflow after the first setup failure. Both attempts were stopped before bootstrap/deploy/tests by Railway rate-limiting railway whoami; each exhausted the existing 10s/20s/40s/80s retry schedule and explicitly reported “This is throttling, not a bad token.”
  • Therefore the current red preview check is external setup throttling, not a deployment or test failure from this change. The mount suite is now configured to fail—not skip—if storage returns 503 once the preview can deploy.

— Codex

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

devops needs-review Agent updated; awaiting Mahmoud's review size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant