Railshot
AI deployment & operations platform
Déployer une application web construite en local sur des environnements cloud et sur site préparés, puis l’exploiter.
Une plateforme IA de déploiement et d’exploitation qui mène une application web construite en local vers des environnements cloud ou sur site préparés, puis continue de l’exploiter.
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
L’écran web et un agent personnel demandent le déploiement par la même API produit.
Le produit, d’une demande de déploiement acceptée jusqu’à la vérification HTTPS publique, en passant par les contrôles CI et la publication de l’image, puis la configuration Git et le déploiement Argo CD sur une cible enregistrée. Le succès n’est consigné qu’avec à la fois une révision appliquée et un contrôle public ; une issue impossible à connaître reste unknown.
Un projet soumis depuis l’écran web, ou depuis un agent IA personnel connecté via MCP, passe par la préparation des fichiers de déploiement, la réparation des échecs, la publication de l’image, le déploiement dans l’environnement et la vérification de l’URL publique ; après le déploiement, le même écran affiche historique et journaux et gère mises à jour, arrêts, reprises et suppressions. Un projet d’équipe.
Période de développement de la compétition : September 28, 2026 to October 4, 2026
L’écran web et le serveur MCP construits pendant le hackathon. Le MCP distant se connecte par OAuth pour soumettre ; les dossiers locaux sont soumis par le MCP local.
Soumettre → accepter
L’écran web, le MCP distant et le MCP local appellent la même API produit, qui consigne une requête vérifiée comme queued et répond 202.
Utilisateur du navigateurdonnées: dossier · ZIP · URL GitHubécran web · historique · Insights
apps/dashboardLa source et un environnement enregistré sont choisis sur l’écran web.
écran web · historique · Insights
apps/dashboarddonnées: même API produit · /api/v1valider · cible · acceptation 202apps/apiL’écran web appelle l’API produit depuis la même origine.
Client MCPdonnées: OAuth · deploy_repositoryOAuth MCP · deploy_repository
agent/remote-mcp.jsLe MCP distant se connecte via OAuth et prend en entrée un dépôt GitHub public.
OAuth MCP · deploy_repository
agent/remote-mcp.jsdonnées: même API produitvalider · cible · acceptation 202apps/apiLe serveur MCP distant appelle la même API de déploiement par son client API interne.
railshot-local MCPdonnées: envoi ZIP · deploy_local_projectvalider · cible · acceptation 202
apps/apiLe MCP stdio sur l’ordinateur de l’utilisateur zippe un dossier et l’envoie. Sa session n’est pas partagée avec la session OAuth distante.
valider · cible · acceptation 202
apps/apidonnées: consigné queued · 202état de l’opération · liaison au runapi/product-store.jsEntrée, cible enregistrée, capacité et clé d’idempotence sont vérifiées ; l’opération est consignée comme queued et la réponse est 202. Un 202 signifie accepté, pas déployé.
état de l’opération · liaison au run
api/product-store.jsdonnées: ordre de la filefile de déploiement · 3 à la foisapps/apiPrises dans l’ordre d’acceptation, dans la limite de déploiements simultanés (3 par défaut).
état de l’opération · liaison au run
api/product-store.jsobservation: état du déploiement · historiqueécran web · historique · Insightsapps/dashboardL’écran web et les outils MCP lisent les mêmes enregistrements d’opération. La dernière tentative et le déploiement vérifié actuel sont affichés séparément, et une tâche IA terminée n’est pas un déploiement réussi.
Contrôles CI → publication de l’image
Le code de plateforme fixé contrôle le commit soumis, ne confie à l’IA que les échecs réparables et ne publie que les images qui repassent les mêmes contrôles.
file de déploiement · 3 à la fois
apps/apidonnées: source commitcommit source · trailersapps/<tenant>/<app>La source soumise devient un commit dans le dépôt privé apps (avec les trailers Railshot-Request et Railshot-Target), et la branche est mise à jour sans force.
file de déploiement · 3 à la fois
apps/apiexécuter · appliquer: workflow_dispatchboucle · contrôles de base L0–L3railshot-deploy.ymlDemande une exécution avec tenant, app, source_commit et target_id. Si la réponse est perdue, elle n’est pas renvoyée ; les exécutions du même commit sont recherchées à la place.
commit source · trailers
apps/<tenant>/<app>données: commit soumisboucle · contrôles de base L0–L3railshot-deploy.ymlSeuls le commit soumis et le code de plateforme fixé (PLATFORM_REF) sont extraits.
réparation SDK · échecs réparables seulement
railshot-deploy.ymldonnées: demande de réparation · conditionnelleAI SDK providerAppelée seulement pour les classes d’échec réparables, et arrêtée quand le même échec se répète ou que la limite de tentatives est atteinte. Réussite ou échec sont décidés par les contrôles, pas par le LLM.
version · publication GHCR · liaison
railshot-deploy.ymldonnées: publier les images vérifiéesGHCRAprès vérification du bundle qui a passé les contrôles, les mêmes images sont publiées sur GHCR. Rien n’est reconstruit.
liaison à l’exécution CI · observation
apps/apiobservation: lecture exécution · publicationrailshot-deploy.ymlUne publication ne compte que si son run id, son commit source, sa cible et son app correspondent à l’enregistrement accepté.
liaison à l’exécution CI · observation
apps/apiéchec · issue inconnue: failed · publication_unverifiedétat de l’opération · liaison au runapi/product-store.jsUn échec de CI ou une publication non vérifiée est consigné avec des diagnostics et n’est pas transmis à la CD.
Appliquer → contrôle public
N’applique via le Git de config et Argo CD que si la publication correspond à la cible enregistrée, et ne consigne le succès qu’après validation de l’adresse HTTPS publique enregistrée.
version · publication GHCR · liaison
railshot-deploy.ymldonnées: images.json · spec · verdict · manifestcd.js · deployPublishedapps/apiLa CD lit les fichiers de l’enregistrement de publication par un chargeur de confiance. La CI elle-même ne crée ni ressource de cluster, ni URL, ni succès de déploiement.
cd.js · deployPublished
apps/apiexécuter · appliquer: appliquer · cible enregistréeconfig de confiance · cible enregistréegitops/bridge.pyExécute gitops/bridge.py avec la config de confiance seulement si l’app et le tenant enregistrés correspondent à l’enregistrement de publication.
commit · push · relecture distante
gitops/bridge.pydonnées: workload commit · pushDépôt Git de configNe commite que workload.json au chemin enregistré d’une branche dédiée, consigne d’abord l’intention de push, pousse, puis relit la révision distante. Un push incertain n’est pas répété.
Dépôt Git de configdonnées: revisioncontrôle Application · AppProject
Argo CDLa révision du dépôt de config vers laquelle pointe l’Application Argo CD.
sync Argo · observation
gitops/bridge.pyexécuter · appliquer: sync · observercontrôle Application · AppProjectArgo CDDemande une sync après contrôle de l’AppProject ; l’observation ne fait que lire, sans sync.
contrôle Application · AppProject
Argo CDexécuter · appliquer: appliquerworkload · ServiceCluster d’applications K3sApplique le workload au cluster cible enregistré.
workload · Service
Cluster d’applications K3sdonnées: pull de l’image · digestGHCRTire le digest publié. Un GHCR privé exige un identifiant de pull dédié.
sonde HTTPS publique
gitops/bridge.pyobservation: HTTPS healthURL HTTPS publiqueNe vérifie que l’adresse HTTPS de health enregistrée par l’opérateur, sans redirection, pour un 200 (et le JSON attendu s’il est défini).
URL HTTPS publiquedonnées: chemin publicworkload · Service
Cluster d’applications K3sLe chemin public (LB, NodePort, certificat) diffère selon le fournisseur et la cible enregistrée.
cd.js · deployPublished
apps/apidonnées: succeeded · revision · URLétat de l’opération · liaison au runapi/product-store.jsConsigné comme succeeded seulement avec cd.deployed, une révision, un contrôle HTTPS public réussi, son heure et une URL valide.
cd.js · deployPublished
apps/apiéchec · issue inconnue: unknown · rapprochement nécessaireétat de l’opération · liaison au runapi/product-store.jsUne issue impossible à connaître reste unknown ; la même application n’est ni renvoyée ni annulée.
Observation · pas le verdict
Métriques et sondes ne décident pas du succès du déploiement. Les valeurs manquantes, périmées et en échec sont affichées telles quelles.
metrics observer
apps/apiobservation: requête PromQLPrometheusLit les séries up, probe_success et Pod. Les valeurs manquantes, périmées ou en échec sont affichées dans cet état et jamais converties en 0.
Prometheusobservation: scrape · probeworkload · Service
Cluster d’applications K3sScrape des exporters et sonde HTTP. Ces métriques ne servent pas à décider du succès du déploiement.
état de l’opération · liaison au run
api/product-store.jsobservation: état du déploiement · historiqueécran web · historique · Insightsapps/dashboardL’écran web et les outils MCP lisent les mêmes enregistrements d’opération. La dernière tentative et le déploiement vérifié actuel sont affichés séparément, et une tâche IA terminée n’est pas un déploiement réussi.
sonde HTTPS publique
gitops/bridge.pyobservation: HTTPS healthURL HTTPS publiqueNe vérifie que l’adresse HTTPS de health enregistrée par l’opérateur, sans redirection, pour un 200 (et le JSON attendu s’il est défini).
Toutes les connexions avec la même épaisseur. Choisissez un flux pour ne mettre en évidence que son chemin, avec des étapes numérotées.
- Trait plein · sens de circulation des sources, images et requêtes
- Tirets · demande d’exécution, application ou sync
- Trait mixte long · lectures d’état, sondes et métriques, distinctes du verdict
- Tiret court · échec consigné ou issue inconnue
- Trait noir épais · le flux sélectionné ; les numéros donnent l’ordre
- Cadre · frontière propriétaire, chemin source dans l’en-tête
- Pastille intérieure · composant de cette frontière
- Cadre en tirets · hors de la plateforme
- Contour orange · là où un modèle décide
- API produit
- Enregistrements de déploiement
- Frontière d’exécution CD
- Entrée · CI · cible
Le schéma du October 2 (bc61a5a) dans docs/architecture/README.md relève de l’historique d’implémentation ; cette architecture suit le code de 645e28a. Fournisseurs et chemins réseau diffèrent selon la cible enregistrée, et cela ne signifie pas que chaque fournisseur est toujours actif.