RAILSHOT.
Torna alla sala

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.

Dal 2026.09.28 al 2026.10.04 · Concluso

Progetto di squadra · il mio contributo: pianificazione e implementazione della CI, cluster CSP e interfaccia Ansible, operazioni, code review e integrazione del team

SoftBank Hackathon 2026 powered by KOREC & ProgatePartecipante alle preliminari · selezione per la finale annunciata il 2026.10.26 (al 2026.10.07)

  • WebImplementato · hackathon
  • Server MCPImplementato · remoto · locale

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

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.

Architettura del prodotto · disegnata dai percorsi del codice al commit pubblico 645e28a
Architettura del prodotto RailshotComponenti e connessioni del prodotto Railshot. La schermata web, l’MCP OAuth remoto e un MCP locale sul computer dell’utente richiedono il deployment tramite la stessa API di prodotto, che registra un commit sorgente e un’esecuzione CI. La CI decide con controlli fissi e pubblica su GHCR le immagini verificate. L’adapter CD applica tramite Git di config e Argo CD solo se il target registrato corrisponde al registro di pubblicazione, poi controlla l’indirizzo HTTPS pubblico registrato e registra l’esito. Le metriche sono osservazione, separate dal verdetto.Utente del browsercartella · ZIP · URL GitHubClient MCPChatGPT · Codex · Clauderailshot-local MCPcomputer dell’utente · stdioGHCRimmagini per digestAI SDK providerCodex · Claude SDKRepo Git di configworkload.json registratoURL HTTPS pubblicopercorso di health registratoPrometheusVM di controllo operativa · letturaapps/dashboardschermata web · cronologia · Insightsagent/remote-mcp.jsOAuth MCP · deploy_repositoryapps/apivalidazione · target · accettazione 202coda di deploy · 3 alla voltabinding dell’esecuzione CI · osservazionecd.js · deployPublishedmetrics observerapi/product-store.jsstato dell’operation · binding della rungitops/bridge.pyconfig attendibile · target registratocommit · push · rilettura remotasync di Argo · osservazioneprobe HTTPS pubblicaArgo CDApplication · controllo dell’AppProjectapps/<tenant>/<app>commit sorgente · trailerrailshot-deploy.ymlloop · controlli di base L0–L3riparazione SDK · solo fallimenti correggibilistessi controlli → bundle testatorelease · pubblicazione GHCR · bindingCluster di app K3sworkload · ServicePiattaforma Railshotcluster operativo · AWSGitHubrepo privato apps · ActionsTarget registratopercorso pubblico per provider1 cartella · ZIP · URL GitHub · Utente del browser → schermata web · cronologia · Insights12stessa API di prodotto · /api/v13 OAuth · deploy_repository · Client MCP → OAuth MCP · deploy_repository34stessa API di prodotto5 upload dello ZIP · deploy_local_project · railshot-local MCP → validazione · target · accettazione 20256 registrato come queued · 202 · validazione · target · accettazione 202 → stato dell’operation · binding della run67 ordine di coda · stato dell’operation · binding della run → coda di deploy · 3 alla volta78stato del deployment · cronologia1source commit2workflow_dispatch3commit inviato4richiesta di correzione · condizionale5pubblicazione delle immagini verificate6esecuzione · lettura della pubblicazione7 failed · publication_unverified · binding dell’esecuzione CI · osservazione → stato dell’operation · binding della run71images.json · spec · verdict · manifest2apply · target registrato3workload commit · push4revision5sync · osservazione6applicazione7pull dell’immagine · digest8HTTPS health9 percorso pubblico · URL HTTPS pubblico → workload · Service910 succeeded · revision · URL · cd.js · deployPublished → stato dell’operation · binding della run1011 unknown · da riconciliare · cd.js · deployPublished → stato dell’operation · binding della run111query PromQL2scrape · probe3stato del deployment · cronologia4HTTPS health

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.

  1. Utente del browserdati: cartella · ZIP · URL GitHubschermata web · cronologia · Insightsapps/dashboard

    Sorgente e ambiente registrato si scelgono nella schermata web.

  2. schermata web · cronologia · Insightsapps/dashboarddati: stessa API di prodotto · /api/v1validazione · target · accettazione 202apps/api

    La schermata web chiama l’API di prodotto dalla stessa origine.

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

    L’MCP remoto si collega via OAuth e prende come input un repository GitHub pubblico.

  4. OAuth MCP · deploy_repositoryagent/remote-mcp.jsdati: stessa API di prodottovalidazione · target · accettazione 202apps/api

    Il server MCP remoto chiama la stessa API di deployment tramite il proprio client API interno.

  5. railshot-local MCPdati: upload dello ZIP · deploy_local_projectvalidazione · target · accettazione 202apps/api

    L’MCP stdio sul computer dell’utente comprime una cartella in ZIP e la carica. La sua sessione non è condivisa con la sessione OAuth remota.

  6. validazione · target · accettazione 202apps/apidati: registrato come queued · 202stato dell’operation · binding della runapi/product-store.js

    Input, 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.

  7. stato dell’operation · binding della runapi/product-store.jsdati: ordine di codacoda di deploy · 3 alla voltaapps/api

    Prelevate in ordine di accettazione, entro il limite di deployment concorrenti (3 per impostazione predefinita).

  8. stato dell’operation · binding della runapi/product-store.jsosservazione: stato del deployment · cronologiaschermata web · cronologia · Insightsapps/dashboard

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

  1. coda di deploy · 3 alla voltaapps/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.

  2. coda di deploy · 3 alla voltaapps/apiesecuzione · applicazione: workflow_dispatchloop · controlli di base L0–L3railshot-deploy.yml

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

  3. commit sorgente · trailerapps/<tenant>/<app>dati: commit inviatoloop · controlli di base L0–L3railshot-deploy.yml

    Viene fatto il checkout solo del commit inviato e del codice di piattaforma fissato (PLATFORM_REF).

  4. riparazione SDK · solo fallimenti correggibilirailshot-deploy.ymldati: richiesta di correzione · condizionaleAI SDK provider

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

  5. release · pubblicazione GHCR · bindingrailshot-deploy.ymldati: pubblicazione delle immagini verificateGHCR

    Dopo aver verificato il bundle che ha superato i controlli, le stesse immagini vengono pubblicate su GHCR. Nulla viene ricompilato.

  6. binding dell’esecuzione CI · osservazioneapps/apiosservazione: esecuzione · lettura della pubblicazionerailshot-deploy.yml

    Una pubblicazione conta solo se run id, commit sorgente, target e app corrispondono al registro accettato.

  7. binding dell’esecuzione CI · osservazioneapps/apifallimento · esito ignoto: failed · publication_unverifiedstato dell’operation · binding della runapi/product-store.js

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

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

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

  2. cd.js · deployPublishedapps/apiesecuzione · applicazione: apply · target registratoconfig attendibile · target registratogitops/bridge.py

    Esegue gitops/bridge.py con la config attendibile solo se app e tenant registrati corrispondono al registro di pubblicazione.

  3. commit · push · rilettura remotagitops/bridge.pydati: workload commit · pushRepo Git di config

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

  4. Repo Git di configdati: revisionApplication · controllo dell’AppProjectArgo CD

    La revisione del repository di config a cui punta l’Application di Argo CD.

  5. sync di Argo · osservazionegitops/bridge.pyesecuzione · applicazione: sync · osservazioneApplication · controllo dell’AppProjectArgo CD

    Richiede una sync dopo aver controllato l’AppProject; l’osservazione legge soltanto, senza sync.

  6. Application · controllo dell’AppProjectArgo CDesecuzione · applicazione: applicazioneworkload · ServiceCluster di app K3s

    Applica il workload al cluster target registrato.

  7. workload · ServiceCluster di app K3sdati: pull dell’immagine · digestGHCR

    Scarica il digest pubblicato. Un GHCR privato richiede una credenziale di pull dedicata.

  8. probe HTTPS pubblicagitops/bridge.pyosservazione: HTTPS healthURL HTTPS pubblico

    Controlla solo l’indirizzo HTTPS di health registrato dall’operatore, senza redirect, per un 200 (e il JSON atteso, se impostato).

  9. URL HTTPS pubblicodati: percorso pubblicoworkload · ServiceCluster di app K3s

    Il percorso pubblico (LB, NodePort, certificato) varia per provider e target registrato.

  10. cd.js · deployPublishedapps/apidati: succeeded · revision · URLstato dell’operation · binding della runapi/product-store.js

    Registrato come succeeded solo con cd.deployed, una revisione, un controllo HTTPS pubblico riuscito, il suo orario e un URL valido.

  11. cd.js · deployPublishedapps/apifallimento · esito ignoto: unknown · da riconciliarestato dell’operation · binding della runapi/product-store.js

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

  1. metrics observerapps/apiosservazione: query PromQLPrometheus

    Legge up, probe_success e le serie dei Pod. I valori mancanti, obsoleti o falliti sono mostrati in quello stato e mai trasformati in 0.

  2. Prometheusosservazione: scrape · probeworkload · ServiceCluster di app K3s

    Scrape dell’exporter e probe HTTP. Queste metriche non servono a decidere il successo del deployment.

  3. stato dell’operation · binding della runapi/product-store.jsosservazione: stato del deployment · cronologiaschermata web · cronologia · Insightsapps/dashboard

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

  4. probe HTTPS pubblicagitops/bridge.pyosservazione: HTTPS healthURL HTTPS pubblico

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