Skip to main content

Promote_Demo kapija — zamjena Write_UAT uslova (MC #900135, 2026-08-22)

Promote_Demo kapija — zamjena Write_UAT uslova (MC #900135, 2026-08-22)

Odluka CEO-a: DA (2026-08-22). Ovo je zapis odluke, ne prijedlog.

Problem

azure-pipelines.yml:2090-2101, stage Promote_Demo:

condition: and( succeeded('E2E_UAT'), succeeded('Write_UAT'), or(Manual, refs/tags/v) )
dependsOn: [ Build, Write_UAT ]

Write_UAT je ljuska (MC #900104, mjereno 2026-08-21):

  • svih 5 apps/e2e/tests/write-uat-*.spec.ts bezuslovno prosljeđuju createUnavailableWriteUatBootstrapAuthVerifier() i createUnavailableWriteUatAllocator()runtimeAvailable:false → uvijek fail(...);
  • stvarni transport postoji u apps/e2e/tests/helpers/write-uat-stage-runtime.ts, ali ga nijedan spec ne koristi — mrtav kod;
  • /internal/write-uat/v1/* ne postoji u apps/api (git grep van apps/e2e daje samo yml i ovaj ugovor);
  • kroz zadnjih 29 buildova koji imaju taj stage: failed 3× (1208, 1217, 1234), skipped inače, succeeded nijednom.

Dakle kapija ne štiti ništa — a blokira sve.

Šta je konkretno blokirala

Ispravan pravni subjekt (SMART FORGE d.o.o.) je na mainu u tri fajla apps/web, ali nije živ na app.bilko.cloud — tamo i dalje piše ALAI Holding AS. To je business_profile.url uslov za Stripe prijavu (MC #900044/#900048), dakle kapija je stajala na putu prihodu.

Ručno guranje na demo nije opcija: Bilko Stage→Demo→Prod Cutover Runbook izričito zabranjuje kopiranje stage oznake u produkciju i ručnu izmjenu container appa iz runbooka. Jedini put je kroz liniju.

Izmjena

condition: and( succeeded('E2E_UAT'), succeeded('Build'), or(eq(Build.Reason,'Manual'), startsWith(Build.SourceBranch,'refs/tags/v')) )
dependsOn: [ Build, E2E_UAT ]

Write_UAT ostaje u liniji i dalje se izvršava — samo prestaje biti uslov za promote.

Šta ostaje zaštićeno (namjerno se NE dira)

  1. Ljudsko odobrenjedeployment: approve_and_deploy_demo, environment: 'bilko-demo'. Nijedan promote ne ide bez klika.
  2. Digest-pinned deploy iz Build outputa (API_DIGEST / WEB_DIGEST).
  3. succeeded('E2E_UAT'), ne not(failed(...)) — fail-open klasa iz MC #107171/#107242 se NE uvodi nazad.
  4. Samo Manual ili v* tag.

Dokazni minimum prije klika na odobrenje

Nije u liniji nego je Johnov korak, po roadmap pravilu "promote samo s dokazom":

  • svjež digest obje slike (api + web) i poklapanje s Build outputom,
  • E2E_UAT zelen na tom istom sha,
  • login smoke kroz pregledač na demo hostu poslije promotea.

Šta ovo NE rješava

Gradnja prave write-UAT kontrolne ravni ostaje MC #900104 — po ugovoru docs/testing/WRITE-UAT-CONTRACT.md to je 10 blokirajućih preflight kapija, dokazi izolacije i uloga, paket dokaza, quiesce/cleanup/rotacija. To je pojačanje, ne blokator prihoda, i radi se odvojeno.