Railshot
AI deployment & operations platform
Distribuire una app web costruita in locale in ambienti cloud e on-premises predisposti, e poi gestirla.
Una piattaforma IA di deployment e operazioni che porta una app web costruita in locale in ambienti cloud o on-premises predisposti e continua a gestirla.
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
La schermata web e un proprio agente richiedono il deployment tramite la stessa API di prodotto.
Il prodotto da una richiesta di deployment accettata, attraverso controlli CI e pubblicazione delle immagini, fino a configurazione Git e rilascio con Argo CD su un target registrato e verifica dell’HTTPS pubblico. Il successo è registrato solo con una revisione applicata e un controllo pubblico; un esito che non può essere noto resta unknown.
Si invia un progetto dalla schermata web, o da un proprio agente IA collegato via MCP, e la piattaforma lo porta attraverso preparazione dei file di deployment, riparazione dei fallimenti, pubblicazione delle immagini, rilascio nell’ambiente e verifica dell’URL pubblico; dopo il deployment la stessa schermata mostra cronologia e log e gestisce aggiornamenti, arresti, riprese ed eliminazione. Un progetto di squadra.
Periodo di sviluppo dell’evento dal September 28, 2026 al October 4, 2026
La schermata web e il server MCP costruiti durante l’hackathon. L’MCP remoto accede con OAuth per inviare; le cartelle locali si inviano tramite l’MCP locale.
Invio → accettazione
La schermata web, l’MCP remoto e l’MCP locale chiamano la stessa API di prodotto, che registra una richiesta verificata come queued e risponde 202.
Utente del browserdati: cartella · ZIP · URL GitHubschermata web · cronologia · Insights
apps/dashboardSorgente e ambiente registrato si scelgono nella schermata web.
schermata web · cronologia · Insights
apps/dashboarddati: stessa API di prodotto · /api/v1validazione · target · accettazione 202apps/apiLa schermata web chiama l’API di prodotto dalla stessa origine.
Client MCPdati: OAuth · deploy_repositoryOAuth MCP · deploy_repository
agent/remote-mcp.jsL’MCP remoto si collega via OAuth e prende come input un repository GitHub pubblico.
OAuth MCP · deploy_repository
agent/remote-mcp.jsdati: stessa API di prodottovalidazione · target · accettazione 202apps/apiIl server MCP remoto chiama la stessa API di deployment tramite il proprio client API interno.
railshot-local MCPdati: upload dello ZIP · deploy_local_projectvalidazione · target · accettazione 202
apps/apiL’MCP stdio sul computer dell’utente comprime una cartella in ZIP e la carica. La sua sessione non è condivisa con la sessione OAuth remota.
validazione · target · accettazione 202
apps/apidati: registrato come queued · 202stato dell’operation · binding della runapi/product-store.jsInput, target registrato, capacità e chiave di idempotenza vengono controllati; l’operation viene registrata come queued e si risponde 202. Un 202 significa accettato, non distribuito.
stato dell’operation · binding della run
api/product-store.jsdati: ordine di codacoda di deploy · 3 alla voltaapps/apiPrelevate in ordine di accettazione, entro il limite di deployment concorrenti (3 per impostazione predefinita).
stato dell’operation · binding della run
api/product-store.jsosservazione: stato del deployment · cronologiaschermata web · cronologia · Insightsapps/dashboardLa schermata web e gli strumenti MCP leggono gli stessi registri delle operation. L’ultimo tentativo e il deployment verificato attuale sono mostrati separatamente, e un’attività IA completata non è un successo di deployment.
Controlli CI → pubblicazione dell’immagine
Il codice di piattaforma fissato controlla il commit inviato, affida all’IA solo i fallimenti correggibili e pubblica solo immagini che hanno superato di nuovo gli stessi controlli.
coda di deploy · 3 alla volta
apps/apidati: source commitcommit sorgente · trailerapps/<tenant>/<app>La sorgente inviata diventa un commit nel repository privato apps (con i trailer Railshot-Request e Railshot-Target), e il branch viene aggiornato senza force.
coda di deploy · 3 alla volta
apps/apiesecuzione · applicazione: workflow_dispatchloop · controlli di base L0–L3railshot-deploy.ymlRichiede un’esecuzione con tenant, app, source_commit e target_id. Se la risposta va persa, non viene reinviata; si cercano invece le esecuzioni per lo stesso commit.
commit sorgente · trailer
apps/<tenant>/<app>dati: commit inviatoloop · controlli di base L0–L3railshot-deploy.ymlViene fatto il checkout solo del commit inviato e del codice di piattaforma fissato (PLATFORM_REF).
riparazione SDK · solo fallimenti correggibili
railshot-deploy.ymldati: richiesta di correzione · condizionaleAI SDK providerViene chiamata solo per classi di errore correggibili e si ferma quando lo stesso errore si ripete o si raggiunge il limite di tentativi. Superamento o fallimento li decidono i controlli, non l’LLM.
release · pubblicazione GHCR · binding
railshot-deploy.ymldati: pubblicazione delle immagini verificateGHCRDopo aver verificato il bundle che ha superato i controlli, le stesse immagini vengono pubblicate su GHCR. Nulla viene ricompilato.
binding dell’esecuzione CI · osservazione
apps/apiosservazione: esecuzione · lettura della pubblicazionerailshot-deploy.ymlUna pubblicazione conta solo se run id, commit sorgente, target e app corrispondono al registro accettato.
binding dell’esecuzione CI · osservazione
apps/apifallimento · esito ignoto: failed · publication_unverifiedstato dell’operation · binding della runapi/product-store.jsUn fallimento della CI o una pubblicazione non verificata viene registrato con la diagnostica e non passa al CD.
Applicazione → controllo pubblico
Applica tramite Git di config e Argo CD solo se la pubblicazione corrisponde al target registrato, e registra il successo solo dopo che l’indirizzo HTTPS pubblico registrato supera il controllo.
release · pubblicazione GHCR · binding
railshot-deploy.ymldati: images.json · spec · verdict · manifestcd.js · deployPublishedapps/apiIl CD legge i file del registro di pubblicazione tramite un loader attendibile. La CI di per sé non crea risorse del cluster, URL o successi di deployment.
cd.js · deployPublished
apps/apiesecuzione · applicazione: apply · target registratoconfig attendibile · target registratogitops/bridge.pyEsegue gitops/bridge.py con la config attendibile solo se app e tenant registrati corrispondono al registro di pubblicazione.
commit · push · rilettura remota
gitops/bridge.pydati: workload commit · pushRepo Git di configEsegue il commit del solo workload.json nel percorso registrato di un branch dedicato, registra prima l’intenzione di push, esegue il push e rilegge la revisione remota. Un push incerto non viene ripetuto.
Repo Git di configdati: revisionApplication · controllo dell’AppProject
Argo CDLa revisione del repository di config a cui punta l’Application di Argo CD.
sync di Argo · osservazione
gitops/bridge.pyesecuzione · applicazione: sync · osservazioneApplication · controllo dell’AppProjectArgo CDRichiede una sync dopo aver controllato l’AppProject; l’osservazione legge soltanto, senza sync.
Application · controllo dell’AppProject
Argo CDesecuzione · applicazione: applicazioneworkload · ServiceCluster di app K3sApplica il workload al cluster target registrato.
workload · Service
Cluster di app K3sdati: pull dell’immagine · digestGHCRScarica il digest pubblicato. Un GHCR privato richiede una credenziale di pull dedicata.
probe HTTPS pubblica
gitops/bridge.pyosservazione: HTTPS healthURL HTTPS pubblicoControlla solo l’indirizzo HTTPS di health registrato dall’operatore, senza redirect, per un 200 (e il JSON atteso, se impostato).
URL HTTPS pubblicodati: percorso pubblicoworkload · Service
Cluster di app K3sIl percorso pubblico (LB, NodePort, certificato) varia per provider e target registrato.
cd.js · deployPublished
apps/apidati: succeeded · revision · URLstato dell’operation · binding della runapi/product-store.jsRegistrato come succeeded solo con cd.deployed, una revisione, un controllo HTTPS pubblico riuscito, il suo orario e un URL valido.
cd.js · deployPublished
apps/apifallimento · esito ignoto: unknown · da riconciliarestato dell’operation · binding della runapi/product-store.jsUn esito che non può essere noto resta unknown; lo stesso apply non viene né reinviato né annullato.
Osservazione · non il verdetto
Metriche e probe non decidono il successo del deployment. I valori mancanti, obsoleti e falliti sono mostrati così come sono.
metrics observer
apps/apiosservazione: query PromQLPrometheusLegge up, probe_success e le serie dei Pod. I valori mancanti, obsoleti o falliti sono mostrati in quello stato e mai trasformati in 0.
Prometheusosservazione: scrape · probeworkload · Service
Cluster di app K3sScrape dell’exporter e probe HTTP. Queste metriche non servono a decidere il successo del deployment.
stato dell’operation · binding della run
api/product-store.jsosservazione: stato del deployment · cronologiaschermata web · cronologia · Insightsapps/dashboardLa schermata web e gli strumenti MCP leggono gli stessi registri delle operation. L’ultimo tentativo e il deployment verificato attuale sono mostrati separatamente, e un’attività IA completata non è un successo di deployment.
probe HTTPS pubblica
gitops/bridge.pyosservazione: HTTPS healthURL HTTPS pubblicoControlla solo l’indirizzo HTTPS di health registrato dall’operatore, senza redirect, per un 200 (e il JSON atteso, se impostato).
Tutte le connessioni con lo stesso peso. Scegliendo un flusso se ne evidenzia solo il percorso, con passi numerati.
- Continua · direzione di sorgente, immagini e richieste
- Tratteggiata · richiesta di esecuzione, applicazione o sync
- Tratto lungo e punto · letture di stato, probe e metriche, separate dal verdetto
- Tratteggio corto · un fallimento registrato o un esito ignoto
- Linea nera spessa · il flusso scelto; i numeri danno l’ordine
- Riquadro · un confine di titolarità, con il percorso sorgente nell’intestazione
- Chip interno · un componente dentro quel confine
- Riquadro tratteggiato · fuori dalla piattaforma
- Contorno arancione · dove decide un modello
- API di prodotto
- Registri di deployment
- Confine di esecuzione del CD
- Ingresso · CI · target
L’immagine del October 2 (bc61a5a) in docs/architecture/README.md è storia dell’implementazione; questa architettura segue il codice di 645e28a. Provider e percorsi di rete variano per target registrato, e ciò non significa che ogni provider sia sempre attivo.