Internal Documentation internal
TalkIDE internal documentation

Verze reprezentuje konkrétní bod v životě projektu — semver MAJOR.MINOR.PATCH (např. 0.1.4). Verze vzniká automaticky při každém commitu (PATCH bump) nebo manuální user akcí (MINOR/MAJOR bump). Vzniklá verze je Pending — do PROD se dostane až po explicitním user Publish.

Tento flow popisuje životní cyklus jedné verze. Související state machine projektu (DRAFT/PUBLISHED/UPDATED) viz Project Management Flow. Detailní design publish workflow viz ADR-022.

Vztah Version ↔ Project ↔ Git tag ↔ K8s deployment

VrstvaReprezentace verze
TalkIDE BE DBTabulka versions (id, project_id, semver, sha, published, published_at)
User-app working treebuild.gradle.kts line version = "X.Y.Z", package.json field "version": "X.Y.Z"
GitLightweight tag vX.Y.Z (vytvořen při Publish, ukazuje na versions.sha)
Container RegistryImage tag <slug>:<semver> (vytvořen Kaniko buildem při Publish)
Kubernetes (PROD)Deployment.spec.template.spec.containers[0].image ukazuje na <slug>:<semver>
Kubernetes (DEV)Image tag = sha; verze v souborech zachycena, ale URL je {projectUuid}.talkide.app

Initial verze: 0.1.0 při Create Project (Mara scaffolding).

Single source of truth: tabulka versions. Soubory + git tag + image tag jsou deriváty, BE je drží v sync.

Životní cyklus verze (state diagram)

stateDiagram-v2
    [*] --> Pending: Commit triggers PATCH bump (or manual MINOR/MAJOR)

    Pending --> Building: User clicks Publish (selects this version)
    Pending --> [*]: Project deleted (cascade)

    Building --> Published: Build + deploy + ingress success, git tag created
    Building --> Failed: Build, deploy or ingress failed

    Failed --> Building: User retries Publish
    Failed --> [*]: Superseded by new version (still in Failed historically)

    Published --> RolledBack: User publishes a different version (this one is no longer live)
    Published --> [*]: Project deleted (cascade)

    RolledBack --> Building: User publishes this version again (rollback-as-publish)
    RolledBack --> [*]: Project deleted (cascade)

Stavy

StateDB reprezentaceDescription
Pendingpublished=false, published_at=NULLVerze vznikla bumpem, ale ještě nebyla v PROD
Buildingpublished=false, projekt v BUILDING stavu, versions.build_id setAktivní PROD build/deploy běží pro tuto verzi
Publishedpublished=true, published_at=<ts>Verze je nebo byla v PROD; aktuálně live verze = MAX(published_at) WHERE published=true
Failedpublished=false, asociovaný builds.status=FAILEDBuild/deploy selhal; user může retry
RolledBackpublished=true, ale není MAX(published_at)Historicky publishnutá, později superseded jinou verzí

RolledBack není explicitní DB flag — je to odvozený stav (published, ale ne aktuálně nejnovější published). UI to zobrazuje pro audit a “Republish” akci.

Trigger události

EventTriggerDB akceSide effects
Bump (PATCH)Git post-commit hook na user/agent commitINSERT versions(semver, sha, published=false), UPDATE projects.current_versionZápis do build.gradle.kts + package.json, follow-up bump commit s [skip-bump], status PUBLISHED → UPDATED
Bump (MINOR/MAJOR)User akce v UI (mimo scope ADR-022, předpokládáno)Stejné jako PATCH, jiný segment semveruStejné side effects
Publish triggeredPOST /api/v1/projects/{slug}/publishprojects.status := BUILDINGValidace hosting kreditu, spuštění Kaniko buildu
Build + deploy successPipeline finishversions.published := true, versions.published_at := now(), projects.status := PUBLISHED, projects.prod_image_tag := <tag>git tag vX.Y.Z, SSE publish.succeeded
Build or deploy failPipeline errorprojects.status := UPDATED (nebo DRAFT pokud první publish), versions.published zůstává falseSSE publish.failed, error visible v UI
Republish older versionUser vybere starší Pending nebo RolledBack verzi v dropdownuStejné jako standardní PublishTag idempotentně preserved (pokud již existuje a ukazuje na correct sha)

Versioning rules

  • Formát: MAJOR.MINOR.PATCH (semver 2.0.0 — bez pre-release/build metadata v alpha)
  • Initial: 0.1.0 při Create Project
  • PATCH bump: automatický, každý commit (user, Mara, Kai)
  • MINOR/MAJOR bump: manuální, user UI akce — předpokládáno (mimo scope B.7)
  • Bot bump commit: identifikován emailem bot@talkide.app + suffixem [skip-bump] v message; post-commit hook ho ignoruje (zamezení smyčky)
  • Unique constraint: (project_id, semver) v tabulce versions — duplicate semver rejected (DB integrity)
  • Versionovaná data: pouze user-app source code; TalkIDE BE má vlastní separate versioning (Spring Boot release tagy)

Business rules

  • Verze v Pending stavu jsou kandidáti pro Publish (UI dropdown default = nejnovější Pending).
  • RolledBack verze (= dříve published, nyní superseded) jsou v dropdownu taky selectable — selection = “publish this old version again” = klasický rollback flow.
  • Failed verze jsou v dropdownu skryté ve výchozím nastavení; user může toggle “Show failed” pro retry.
  • git tag vX.Y.Z je vytvořen pouze po úspěšném Publish (ne při bumpu). Tag je lightweight, lokální, žádný external push (ADR-013).
  • Tag pointuje na versions.sha = commit s funkčním kódem (před bump commitem [skip-bump]). Bump commit sám tagován není — viz ADR-022 sekce “Risks”.
  • Smazání projektu kaskádově maže všechny verze (DB CASCADE). PROD K8s resources se smažou separátním cleanup flow (mimo scope tohoto dokumentu).
  • Hosting billing stav (hosting_billing_account.status) je validován před přechodem Pending → Building. SUSPENDED účet → 402 HOSTING_BUDGET_EXCEEDED, verze zůstává v Pending. (⚠️ Pozn.: původní UserBudgetEntity.hostingCreditUsd prepaid check odstraněn v be#142 — hosting je výhradně postpaid, DP-7.)
  • Concurrent Publish ochrana: projects.status := BUILDING v transakci s podmínkou status IN (DRAFT, PUBLISHED, UPDATED) — second concurrent click vrátí 409.

Vztah k Project Management Flow

Project statusPovolené Version transitions
DRAFTBump (Pending vznik); Publish (Pending → Building)
BUILDINGŽádné Publish; bump je teoreticky možný, ale UI commit gesture je disabled během buildu
PUBLISHEDBump (Pending vznik, status → UPDATED); Publish jiné verze (rollback flow)
UPDATEDBump (Pending vznik); Publish (Pending → Building)
PAUSEDŽádný bump (commit gesture disabled), žádný Publish
ARCHIVEDŽádný bump, žádný Publish; verze v DB zachovány read-only

Was this page helpful?

Thanks for the feedback.