RAILSHOT.
Back to the hall

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.

2026.09.28 — 2026.10.04 · Completed

Team project · my part: CI planning and implementation, CSP clusters and Ansible interface, operations, team code review and integration

SoftBank Hackathon 2026 powered by KOREC & ProgatePreliminary participant · finals selection — be announced 2026.10.26 (as of 2026.10.07)

  • WebImplemented · hackathon
  • MCP serverImplemented · remote · local

Railshot vocabulary

Lens
Deployment
Delivery
Endpoint Verification
Evidence
Artifact Identity
Reconciliation
  1. intake
  2. checks
  3. repair
  4. publish
  5. rollout
  1. route
  2. probe
  1. source commit
  2. digest
  3. binding
  1. unknown
  2. resume
  3. 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.

Product architecture · drawn from the code paths at public commit 645e28a
Railshot product architectureComponents and connections of the Railshot product. The web screen, the remote OAuth MCP and a local MCP on the user’s computer request deployment through the same product API, which registers a source commit and a CI run. CI decides by fixed checks and publishes the checked images to GHCR. The CD adapter applies through config Git and Argo CD only when the registered target matches the publication record, then checks the registered public HTTPS address and records the outcome. Metrics are observation, separate from the verdict.Browser userfolder · ZIP · GitHub URLMCP clientChatGPT · Codex · Clauderailshot-local MCPuser’s computer · stdioGHCRimages by digestAI SDK providerCodex · Claude SDKConfig Git reporegistered workload.jsonPublic HTTPS URLregistered health pathPrometheusoperations control VM · readapps/dashboardweb screen · history · Insightsagent/remote-mcp.jsOAuth MCP · deploy_repositoryapps/apivalidate · target · 202 acceptdeploy queue · 3 at a timeCI run binding · observecd.js · deployPublishedmetrics observerapi/product-store.jsoperation state · run bindinggitops/bridge.pytrusted config · registered targetcommit · push · remote readbackArgo sync · observepublic HTTPS probeArgo CDApplication · AppProject checkapps/<tenant>/<app>source commit · trailersrailshot-deploy.ymlloop · baseline checks L0–L3SDK repair · fixable failures onlysame checks → tested bundlerelease · GHCR publish · bindingK3s app clusterworkload · ServiceRailshot platformoperations cluster · AWSGitHubprivate apps repo · ActionsRegistered targetpublic path per provider1 folder · ZIP · GitHub URL · Browser user → web screen · history · Insights12same product API · /api/v13 OAuth · deploy_repository · MCP client → OAuth MCP · deploy_repository34same product API5 ZIP upload · deploy_local_project · railshot-local MCP → validate · target · 202 accept56 recorded queued · 202 · validate · target · 202 accept → operation state · run binding67 queue order · operation state · run binding → deploy queue · 3 at a time78deployment state · history1source commit2workflow_dispatch3submitted commit4repair request · conditional5publish checked images6run · publication read7 failed · publication_unverified · CI run binding · observe → operation state · run binding71images.json · spec · verdict · manifest2apply · registered target3workload commit · push4revision5sync · observe6apply7image pull · digest8HTTPS health9 public path · Public HTTPS URL → workload · Service910 succeeded · revision · URL · cd.js · deployPublished → operation state · run binding1011 unknown · needs reconciliation · cd.js · deployPublished → operation state · run binding111PromQL query2scrape · probe3deployment state · history4HTTPS health

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.

  1. Browser userdata: folder · ZIP · GitHub URLweb screen · history · Insightsapps/dashboard

    The source and a registered environment are chosen on the web screen.

  2. web screen · history · Insightsapps/dashboarddata: same product API · /api/v1validate · target · 202 acceptapps/api

    The web screen calls the product API from the same origin.

  3. MCP clientdata: OAuth · deploy_repositoryOAuth MCP · deploy_repositoryagent/remote-mcp.js

    The remote MCP connects over OAuth and takes a public GitHub repository as input.

  4. OAuth MCP · deploy_repositoryagent/remote-mcp.jsdata: same product APIvalidate · target · 202 acceptapps/api

    The remote MCP server calls the same deployment API through its internal API client.

  5. railshot-local MCPdata: ZIP upload · deploy_local_projectvalidate · target · 202 acceptapps/api

    The stdio MCP on the user’s computer zips a folder and uploads it. Its session is not shared with the remote OAuth session.

  6. validate · target · 202 acceptapps/apidata: recorded queued · 202operation state · run bindingapi/product-store.js

    Input, registered target, capacity and idempotency key are checked; the operation is recorded as queued and answered with 202. A 202 means accepted, not deployed.

  7. operation state · run bindingapi/product-store.jsdata: queue orderdeploy queue · 3 at a timeapps/api

    Taken in order of acceptance, within the concurrent deployment limit (3 by default).

  8. operation state · run bindingapi/product-store.jsobservation: deployment state · historyweb screen · history · Insightsapps/dashboard

    The 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.

  1. deploy queue · 3 at a timeapps/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.

  2. deploy queue · 3 at a timeapps/apirun · apply: workflow_dispatchloop · baseline checks L0–L3railshot-deploy.yml

    Requests 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.

  3. source commit · trailersapps/<tenant>/<app>data: submitted commitloop · baseline checks L0–L3railshot-deploy.yml

    Only the submitted commit and pinned platform code (PLATFORM_REF) are checked out.

  4. SDK repair · fixable failures onlyrailshot-deploy.ymldata: repair request · conditionalAI SDK provider

    Called 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.

  5. release · GHCR publish · bindingrailshot-deploy.ymldata: publish checked imagesGHCR

    After verifying the bundle that passed the checks, the same images are published to GHCR. Nothing is rebuilt.

  6. CI run binding · observeapps/apiobservation: run · publication readrailshot-deploy.yml

    A publication counts only when its run id, source commit, target and app match the accepted record.

  7. CI run binding · observeapps/apifailure · unknown outcome: failed · publication_unverifiedoperation state · run bindingapi/product-store.js

    A 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.

  1. release · GHCR publish · bindingrailshot-deploy.ymldata: images.json · spec · verdict · manifestcd.js · deployPublishedapps/api

    CD reads the publication record’s files through a trusted loader. CI itself creates no cluster resource, URL or deployment success.

  2. cd.js · deployPublishedapps/apirun · apply: apply · registered targettrusted config · registered targetgitops/bridge.py

    Runs gitops/bridge.py with the trusted config only when the registered app and tenant match the publication record.

  3. commit · push · remote readbackgitops/bridge.pydata: workload commit · pushConfig Git repo

    Commits 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.

  4. Config Git repodata: revisionApplication · AppProject checkArgo CD

    The config repository revision that the Argo CD Application points to.

  5. Argo sync · observegitops/bridge.pyrun · apply: sync · observeApplication · AppProject checkArgo CD

    Requests a sync after checking the AppProject; observing only reads, without a sync.

  6. Application · AppProject checkArgo CDrun · apply: applyworkload · ServiceK3s app cluster

    Applies the workload to the registered target cluster.

  7. workload · ServiceK3s app clusterdata: image pull · digestGHCR

    Pulls the published digest. A private GHCR needs a dedicated pull credential.

  8. public HTTPS probegitops/bridge.pyobservation: HTTPS healthPublic HTTPS URL

    Checks only the operator-registered HTTPS health address, without redirects, for 200 (and the expected JSON if set).

  9. Public HTTPS URLdata: public pathworkload · ServiceK3s app cluster

    The public path (LB, NodePort, certificate) differs by provider and registered target.

  10. cd.js · deployPublishedapps/apidata: succeeded · revision · URLoperation state · run bindingapi/product-store.js

    Recorded as succeeded only with cd.deployed, a revision, a successful public HTTPS check, its time and a valid URL.

  11. cd.js · deployPublishedapps/apifailure · unknown outcome: unknown · needs reconciliationoperation state · run bindingapi/product-store.js

    An 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.

  1. metrics observerapps/apiobservation: PromQL queryPrometheus

    Reads up, probe_success and Pod series. Missing, stale or failed values are shown in that state and never turned into 0.

  2. Prometheusobservation: scrape · probeworkload · ServiceK3s app cluster

    Exporter scrape and HTTP probe. These metrics are not used to decide deployment success.

  3. operation state · run bindingapi/product-store.jsobservation: deployment state · historyweb screen · history · Insightsapps/dashboard

    The 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.

  4. public HTTPS probegitops/bridge.pyobservation: HTTPS healthPublic HTTPS URL

    Checks 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.