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

<!-- ALAI-MC:900135:BEFORE -->

# 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](https://docs.alai.no/books/deployment-runbooks/page/bilko-stagedemoprod-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 odobrenje** — `deployment: 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.