Railshot
AI deployment & operations platform
ローカルで作ったWebアプリを、用意されたクラウドとオンプレミス環境にデプロイし、運用します。
ローカルで作ったWebアプリを、用意されたクラウドやオンプレミス環境にデプロイし、運用まで続けるAIデプロイ・運用プラットフォームです。
Railshot vocabulary
- intake
- checks
- repair
- publish
- rollout
- route
- probe
- source commit
- digest
- binding
- unknown
- resume
- observation
Intake: deploy_repository · deploy_local_project · OAUTH MCP · Idempotency-Key · IDEMPOTENCY_CONFLICT · 202 ACCEPTED · EXECUTOR_BUSY · CAPACITY_EXCEEDED · maxConcurrentDeployments · workflow_dispatch · TARGET ALLOWLIST · reconciliation_required · CI_DISPATCH_UNCONFIRMEDChecks: package.policy · package.spec · source.quality · image.build · image.runtime · image.scan · GATE_ORDER · verdict.json · release_eligible · GATE VERDICT · SECRET SCAN · --cap-drop=ALL · source_change_allowed · verify_imagesAI Repair: GATE VERDICT · FIXABLE · give_up · PROMPT INJECTION · FAILURE SIGNATURE · REPAIR_SCOPE · MAX_REPAIR_ATTEMPTS · claude-agent-sdk · openai-codex · fixer · lessons.md · source_change_allowed · SDK_OUTCOME_UNKNOWNPublish: release_eligible · GHCR · images.json · EXACT TESTED BUNDLE · GITHUB-HOSTED RELEASE · published · publication_unverified · MANIFEST INSPECT · REGISTRY_VISIBILITY · publish-journal · railshot-release · containerd-snapshotter · images.tar · handoff.jsonRollout: bridge.py · workload.json · CONFIG GIT · pushing · REMOTE READBACK · ARGO CD · Synced · Healthy · targetRevision · sync_requested · NO PRUNE, NO FORCE · NetworkPolicy · readinessProbe · observed_images · NEVER BLINDLY RETRYPublic Route: routing · SHARED ALB · aws_lb_listener_rule · aws_lb_target_group · aws_route53_record · NodePort · LISTENER OWNERSHIP · GCP_ROUTE_APPLY_TIMEOUT · GCP_CERTIFICATE_DNS_FAILED · WireGuardHealth Probe: public_probe · site_probe · railshot-health/1 · NO PROXY, NO REDIRECT · expected_json · HTTPS 200 · verified_at · public_http · health_path · readinessProbe · probe_successSource Commit: workflow_dispatch · targetRevision · Railshot-Request · Railshot-Target · source_commit · source_parent · force: false · source_digest · snapshot.json · GITHUB_SHA · PLATFORM_REF · harness_sha256 · SUBMITTED SOURCE CHANGED · source_preparedImage Digest: GHCR · images.json · MANIFEST INSPECT · source_digest · IMMUTABLE GHCR DIGEST · images_sha256 · observed_images · PULL BY DIGEST · imagePullSecrets · containerd-snapshotter · RESUME_PUBLICATION_CHANGED · verify_images · images.tarRun Binding: Idempotency-Key · published · Railshot-Request · Railshot-Target · handoff.json · producer_attempt · bundle_artifact_id · run_id · state.bindings · CI_BINDING_MISMATCH · DEPLOYMENT BINDING CONFLICT · config_sha256 · TARGET ALLOWLIST · registered_applicationUnknown Outcome: publication_unverified · pushing · GCP_ROUTE_APPLY_TIMEOUT · outcome_unknown · CD_RECONCILE_REQUIRED · reconciliation_required · CD_OUTCOME_UNKNOWN · SDK_OUTCOME_UNKNOWN · unknown_timeout · CI_DISPATCH_UNCONFIRMED · NEVER BLINDLY RETRY · after_reconcile · reconcile_remote · CI_DISPATCH_NOT_IDENTIFIED · READ-ONLY OBSERVEResume: publish-journal · source_parent · RESUME_PUBLICATION_CHANGED · --resume · state.sqlite3 · resumePrepared · findDeployment · recoverDispatch · source_prepared · CI_DISPATCH_NOT_IDENTIFIED · resume_count · SAME WORKFLOW RUN · INTERRUPTEDObservation: observationRetry · next_retry_at · consecutive_failures · no_data · stale · collection_failed · NOT A SUCCESS GATE · probe_success · PROMETHEUS · BLACKBOX EXPORTER · READ-ONLY OBSERVE
Web画面と自分のエージェントが、同じ製品APIでデプロイを要求します。
受け付けたデプロイ要求が、CIの検査とイメージの公開を経て、登録された対象でのGit構成とArgo CDによる適用、公開HTTPSの確認まで進む製品の構成です。適用されたrevisionと公開確認の両方がそろったときだけ成功として記録し、知りえない結果はunknownのまま残します。
Web画面、またはMCPで接続した自分のAIエージェントからプロジェクトを提出すると、デプロイファイルの準備、失敗の修正、イメージの公開、環境への適用、公開URLの確認まで進みます。デプロイ後も同じ画面で履歴とログを確認し、更新、停止、再開、削除を管理します。チームプロジェクトです。
大会開発期間 September 28, 2026 to October 4, 2026
ハッカソン期間に作ったWeb画面とMCPサーバーです。リモートMCPはOAuthでログインして提出し、ローカルのフォルダーはローカルMCPで提出します。
提出 → 受付
Web画面、リモートMCP、ローカルMCPが同じ製品APIを呼び出し、APIは確認したリクエストをqueuedとして記録して202で応答します。
ブラウザユーザーデータ: フォルダー · ZIP · GitHub URLWeb画面 · 履歴 · Insights
apps/dashboardWeb画面でソースと登録済みの環境を選びます。
Web画面 · 履歴 · Insights
apps/dashboardデータ: 同じ製品API · /api/v1検証 · 対象確認 · 202受付apps/apiWeb画面は同一オリジンの製品APIを呼び出します。
MCPクライアントデータ: OAuth · deploy_repositoryOAuth MCP · deploy_repository
agent/remote-mcp.jsリモートMCPはOAuthで接続し、公開GitHubリポジトリを入力として受け取ります。
OAuth MCP · deploy_repository
agent/remote-mcp.jsデータ: 同じ製品API検証 · 対象確認 · 202受付apps/apiリモートMCPサーバーは、内部のAPIクライアントで同じデプロイAPIを呼び出します。
railshot-local MCPデータ: ZIPアップロード · deploy_local_project検証 · 対象確認 · 202受付
apps/apiユーザーのコンピューター上のstdio MCPがフォルダーをZIPにまとめてアップロードします。このセッションはリモートのOAuthセッションとは共有されません。
検証 · 対象確認 · 202受付
apps/apiデータ: queuedとして記録 · 202operationの状態 · runのバインドapi/product-store.js入力、登録済みの対象、容量、idempotencyキーを確認し、operationをqueuedとして記録して202で応答します。202は受付であり、デプロイの成功ではありません。
operationの状態 · runのバインド
api/product-store.jsデータ: キューの順序デプロイキュー · 同時3件apps/api同時デプロイ数(既定3)の範囲で、受付順に取り出します。
operationの状態 · runのバインド
api/product-store.js観測: デプロイ状態 · 履歴Web画面 · 履歴 · Insightsapps/dashboardWeb画面とMCPツールは同じoperation記録を読み取ります。最新の試行と現在の検証済みデプロイを分けて表示し、AIタスクの完了はデプロイの成功ではありません。
CI検査 → イメージ公開
固定されたプラットフォームコードが提出コミットを検査し、修正可能な失敗だけをAIに任せ、同じ検査を再び通過したイメージだけを公開します。
デプロイキュー · 同時3件
apps/apiデータ: source commitソースコミット · trailerapps/<tenant>/<app>提出されたソースを非公開のappsリポジトリのコミットにし(Railshot-RequestとRailshot-Targetのtrailer付き)、ブランチをforceなしで更新します。
デプロイキュー · 同時3件
apps/api実行 · 適用: workflow_dispatchループ · ベースライン検査L0–L3railshot-deploy.ymltenant、app、source_commit、target_idで実行を要求します。応答が失われても再送せず、同じコミットの実行を検索します。
ソースコミット · trailer
apps/<tenant>/<app>データ: 提出コミットループ · ベースライン検査L0–L3railshot-deploy.yml提出コミットと固定されたプラットフォームコード(PLATFORM_REF)だけをcheckoutします。
SDKによる修正 · 修正可能な失敗のみ
railshot-deploy.ymlデータ: 修正案の要求 · 条件付きAI SDK provider修正可能な失敗分類のときだけ呼び出し、同じ失敗が繰り返されるか試行上限に達すると停止します。合否はLLMではなく検査が決めます。
リリース · GHCRへ公開 · バインド
railshot-deploy.ymlデータ: 検査済みイメージを公開GHCR検査を通過したbundleを確認した後、同じイメージをGHCRに公開します。再ビルドはしません。
CI実行のバインド · 観測
apps/api観測: 実行 · 公開記録の読み取りrailshot-deploy.ymlrun id、ソースコミット、対象、appが受付記録と一致した場合にのみ、公開として認めます。
CI実行のバインド · 観測
apps/api失敗 · 不明な結果: failed · publication_unverifiedoperationの状態 · runのバインドapi/product-store.jsCIの失敗や未確認の公開は診断とともに記録し、CDには渡しません。
適用 → 公開確認
公開記録が登録済みの対象と一致する場合にのみconfig GitとArgo CDで適用し、登録された公開HTTPSアドレスの確認が通ってはじめて成功として記録します。
リリース · GHCRへ公開 · バインド
railshot-deploy.ymlデータ: images.json · spec · verdict · manifestcd.js · deployPublishedapps/apiCDは公開記録のファイルを信頼済みのローダーで読み込みます。CI自体は、クラスターのリソースもURLもデプロイの成功も生み出しません。
cd.js · deployPublished
apps/api実行 · 適用: 適用 · 登録済みの対象信頼済みconfig · 登録済みの対象gitops/bridge.py登録済みのアプリとtenantが公開記録と一致する場合にのみ、信頼済みのconfigでgitops/bridge.pyを実行します。
commit · push · リモートの読み戻し
gitops/bridge.pyデータ: workload commit · pushconfig Gitリポジトリ専用ブランチの登録済みパスにあるworkload.jsonだけをコミットし、push意図を先に記録してからpushし、リモートのrevisionを読み戻します。結果が不確かなpushは繰り返しません。
config Gitリポジトリデータ: revisionApplication · AppProject検査
Argo CDArgo CD Applicationが指すconfigリポジトリのrevisionです。
Argo sync · 観測
gitops/bridge.py実行 · 適用: sync · 観測Application · AppProject検査Argo CDAppProjectを検査した後にsyncを要求します。観測時はsyncせず、読み取るだけです。
Application · AppProject検査
Argo CD実行 · 適用: 適用workload · ServiceK3sアプリクラスター登録された対象クラスターにworkloadを適用します。
workload · Service
K3sアプリクラスターデータ: イメージpull · ダイジェストGHCR公開されたダイジェストをpullします。非公開のGHCRには専用のpull用認証情報が必要です。
公開HTTPSプローブ
gitops/bridge.py観測: HTTPS health公開HTTPS URL運用者が登録したHTTPSのhealthアドレスだけを、リダイレクトなしで、200(設定されていれば期待するJSONも)を返すか確認します。
公開HTTPS URLデータ: 公開経路workload · Service
K3sアプリクラスター公開経路(LB、NodePort、証明書)は、プロバイダーと登録済みの対象ごとに異なります。
cd.js · deployPublished
apps/apiデータ: succeeded · revision · URLoperationの状態 · runのバインドapi/product-store.jscd.deployed、revision、成功した公開HTTPS確認とその時刻、有効なURLがそろったときだけsucceededとして記録します。
cd.js · deployPublished
apps/api失敗 · 不明な結果: unknown · 再調整が必要operationの状態 · runのバインドapi/product-store.js知りえない結果はunknownのまま残し、同じ適用を再送も巻き戻しもしません。
観測 · 判定とは別
メトリクスとプローブはデプロイの成功を決めません。欠損、古い値、失敗した値はそのまま表示します。
metrics observer
apps/api観測: PromQLクエリPrometheusup、probe_success、Podの系列を読み取ります。欠損、古い値、失敗した値はその状態のまま表示し、0に置き換えることはありません。
Prometheus観測: scrape · probeworkload · Service
K3sアプリクラスターexporterのscrapeとHTTPプローブです。これらのメトリクスはデプロイ成功の判定には使いません。
operationの状態 · runのバインド
api/product-store.js観測: デプロイ状態 · 履歴Web画面 · 履歴 · Insightsapps/dashboardWeb画面とMCPツールは同じoperation記録を読み取ります。最新の試行と現在の検証済みデプロイを分けて表示し、AIタスクの完了はデプロイの成功ではありません。
公開HTTPSプローブ
gitops/bridge.py観測: HTTPS health公開HTTPS URL運用者が登録したHTTPSのhealthアドレスだけを、リダイレクトなしで、200(設定されていれば期待するJSONも)を返すか確認します。
すべての接続を同じ太さで表示します。フローを選ぶと、その経路だけを番号付きで強調します。
- 実線 · ソース、イメージ、リクエストが流れる方向
- 破線 · 実行要求、適用、sync
- 長い一点鎖線 · 状態の読み取り、プローブ、メトリクス、判定とは別
- 短い破線 · 記録された失敗または不明な結果
- 太い黒線 · 選んだフロー。番号は順序
- ボックス · 所有の境界、見出しにソースパス
- 内側のチップ · その境界内の構成要素
- 破線ボックス · プラットフォーム外
- オレンジの枠 · モデルが判断する場所
- 製品API
- デプロイ記録
- CD実行境界
- 入口 · CI · 対象
docs/architecture/README.mdにある10月2日時点(bc61a5a)の図は実装の履歴で、この構成図は645e28aのコードに従います。プロバイダーとネットワーク経路は登録済みの対象ごとに異なり、すべてのプロバイダーが常に稼働しているという意味ではありません。