Railshot
AI deployment & operations platform
Deploy a locally built web app to prepared cloud and on-premises environments, then run it.
An AI deployment and operations platform that takes a web app built locally to prepared cloud or on-premises environments and keeps running it.
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
The web screen and your own agent request deployment through the same product API.
The product from an accepted deployment request, through CI checks and image publication, to Git configuration and Argo CD rollout on a registered target and public HTTPS verification. Success is recorded only with both an applied revision and a public check; an outcome that cannot be known stays unknown.
Submit a project from the web screen, or from your own AI agent connected over MCP, and it carries through deployment file preparation, failure repair, image publication, environment rollout and public URL verification; after deployment the same screen shows history and logs and manages updates, stops, resumes and deletion. A team project.
Event development window September 28, 2026 to October 4, 2026
The web screen and MCP server built during the hackathon. Remote MCP signs in with OAuth to submit; local folders are submitted through the local MCP.
Submit → accept
The web screen, the remote MCP and the local MCP call the same product API, which records a checked request as queued and answers 202.
Browser userdata: folder · ZIP · GitHub URLweb screen · history · Insights
apps/dashboardThe source and a registered environment are chosen on the web screen.
web screen · history · Insights
apps/dashboarddata: same product API · /api/v1validate · target · 202 acceptapps/apiThe web screen calls the product API from the same origin.
MCP clientdata: OAuth · deploy_repositoryOAuth MCP · deploy_repository
agent/remote-mcp.jsThe remote MCP connects over OAuth and takes a public GitHub repository as input.
OAuth MCP · deploy_repository
agent/remote-mcp.jsdata: same product APIvalidate · target · 202 acceptapps/apiThe remote MCP server calls the same deployment API through its internal API client.
railshot-local MCPdata: ZIP upload · deploy_local_projectvalidate · target · 202 accept
apps/apiThe stdio MCP on the user’s computer zips a folder and uploads it. Its session is not shared with the remote OAuth session.
validate · target · 202 accept
apps/apidata: recorded queued · 202operation state · run bindingapi/product-store.jsInput, registered target, capacity and idempotency key are checked; the operation is recorded as queued and answered with 202. A 202 means accepted, not deployed.
operation state · run binding
api/product-store.jsdata: queue orderdeploy queue · 3 at a timeapps/apiTaken in order of acceptance, within the concurrent deployment limit (3 by default).
operation state · run binding
api/product-store.jsobservation: deployment state · historyweb screen · history · Insightsapps/dashboardThe web screen and the MCP tools read the same operation records. The latest attempt and the current verified deployment are shown separately, and a finished AI task is not deployment success.
CI checks → image publish
Pinned platform code checks the submitted commit, hands only fixable failures to AI, and publishes only images that passed the same checks again.
deploy queue · 3 at a time
apps/apidata: source commitsource commit · trailersapps/<tenant>/<app>The submitted source becomes a commit in the private apps repository (with Railshot-Request and Railshot-Target trailers), and the branch is updated without force.
deploy queue · 3 at a time
apps/apirun · apply: workflow_dispatchloop · baseline checks L0–L3railshot-deploy.ymlRequests a run with tenant, app, source_commit and target_id. If the response is lost, it is not sent again; the runs for the same commit are searched instead.
source commit · trailers
apps/<tenant>/<app>data: submitted commitloop · baseline checks L0–L3railshot-deploy.ymlOnly the submitted commit and pinned platform code (PLATFORM_REF) are checked out.
SDK repair · fixable failures only
railshot-deploy.ymldata: repair request · conditionalAI SDK providerCalled only for fixable failure classes, and stopped when the same failure repeats or the attempt limit is reached. Pass or fail is decided by the checks, not by the LLM.
release · GHCR publish · binding
railshot-deploy.ymldata: publish checked imagesGHCRAfter verifying the bundle that passed the checks, the same images are published to GHCR. Nothing is rebuilt.
CI run binding · observe
apps/apiobservation: run · publication readrailshot-deploy.ymlA publication counts only when its run id, source commit, target and app match the accepted record.
CI run binding · observe
apps/apifailure · unknown outcome: failed · publication_unverifiedoperation state · run bindingapi/product-store.jsA CI failure or an unverified publication is recorded with diagnostics and is not passed to CD.
Apply → public check
Applies through config Git and Argo CD only when the publication matches the registered target, and records success only after the registered public HTTPS address checks out.
release · GHCR publish · binding
railshot-deploy.ymldata: images.json · spec · verdict · manifestcd.js · deployPublishedapps/apiCD reads the publication record’s files through a trusted loader. CI itself creates no cluster resource, URL or deployment success.
cd.js · deployPublished
apps/apirun · apply: apply · registered targettrusted config · registered targetgitops/bridge.pyRuns gitops/bridge.py with the trusted config only when the registered app and tenant match the publication record.
commit · push · remote readback
gitops/bridge.pydata: workload commit · pushConfig Git repoCommits only workload.json at the registered path of a dedicated branch, records the push intent first, pushes, and reads the remote revision back. An uncertain push is not repeated.
Config Git repodata: revisionApplication · AppProject check
Argo CDThe config repository revision that the Argo CD Application points to.
Argo sync · observe
gitops/bridge.pyrun · apply: sync · observeApplication · AppProject checkArgo CDRequests a sync after checking the AppProject; observing only reads, without a sync.
Application · AppProject check
Argo CDrun · apply: applyworkload · ServiceK3s app clusterApplies the workload to the registered target cluster.
workload · Service
K3s app clusterdata: image pull · digestGHCRPulls the published digest. A private GHCR needs a dedicated pull credential.
public HTTPS probe
gitops/bridge.pyobservation: HTTPS healthPublic HTTPS URLChecks only the operator-registered HTTPS health address, without redirects, for 200 (and the expected JSON if set).
Public HTTPS URLdata: public pathworkload · Service
K3s app clusterThe public path (LB, NodePort, certificate) differs by provider and registered target.
cd.js · deployPublished
apps/apidata: succeeded · revision · URLoperation state · run bindingapi/product-store.jsRecorded as succeeded only with cd.deployed, a revision, a successful public HTTPS check, its time and a valid URL.
cd.js · deployPublished
apps/apifailure · unknown outcome: unknown · needs reconciliationoperation state · run bindingapi/product-store.jsAn outcome that cannot be known stays unknown; the same apply is neither re-sent nor rolled back.
Observation · not the verdict
Metrics and probes do not decide deployment success. Missing, stale and failed values are shown as they are.
metrics observer
apps/apiobservation: PromQL queryPrometheusReads up, probe_success and Pod series. Missing, stale or failed values are shown in that state and never turned into 0.
Prometheusobservation: scrape · probeworkload · Service
K3s app clusterExporter scrape and HTTP probe. These metrics are not used to decide deployment success.
operation state · run binding
api/product-store.jsobservation: deployment state · historyweb screen · history · Insightsapps/dashboardThe web screen and the MCP tools read the same operation records. The latest attempt and the current verified deployment are shown separately, and a finished AI task is not deployment success.
public HTTPS probe
gitops/bridge.pyobservation: HTTPS healthPublic HTTPS URLChecks only the operator-registered HTTPS health address, without redirects, for 200 (and the expected JSON if set).
Every connection at the same weight. Pick a flow to highlight only its path, with numbered steps.
- Solid · the direction source, images and requests flow
- Dashed · run request, apply or sync
- Long dash-dot · status reads, probes and metrics, separate from the verdict
- Short dash · a recorded failure or unknown outcome
- Heavy black line · the selected flow; numbers give the order
- Box · an owning boundary, its source path in the header
- Inner chip · a component inside that boundary
- Dashed box · outside the platform
- Orange outline · where a model decides
- Product API
- Deployment records
- CD execution boundary
- Entry · CI · target
The October 2 (bc61a5a) picture in docs/architecture/README.md is implementation history; this architecture follows the 645e28a code. Providers and network paths differ by registered target, and this does not mean every provider is always on.