Rasadnik Milić · Plant Garden · status

Projektna organizacija

Kako je projekt složen, kako se posao predaje i prima, i što od toga mora preživjeti promjenu ljudi. Od 17. rujna 2026. nosi i odluku o podjeli na više repozitorija — sa svim mjerenjima koja su je donijela.

Postavljeno 16. rujna · mjereno 17. i 18. rujna · brojke premjerene 20. rujna 2026. 1.580 commita u deset repozitorija · 46 dana s commitom · 41 grana · nijedno dodatno radno stablo (20. 9.) Spec → plan → izvršitelj → provjeritelj → spajanje Odluka o podjeli: zapisana, neizvedena Provjereno u repozitoriju, ne po dokumentaciji

Plan je izveden 17. rujna 2026. Ostale kartice opisuju kako se do ovoga došlo i zašto — namjerno nisu prepisane, jer su zapis polazišta. Ova kaže što sada stvarno stoji. Svaka brojka ispod izmjerena je tog dana, nijedna nije prepisana iz dokumenta.

Deset repozitorija plant-garden na GitLabu · šest u koraku s remoteom, četiri ispred · premjereno 20. 9. 2026.

Ova je tablica 18. 9. ujutro brojila devet repozitorija, osam pushanih i dva skeleta. Do večeri istog dana sve troje je prestalo biti istina: trgovine su pushane, flora-infra je iz jednog commita narastao na 65 i prestao biti skelet, a flora-base je dobio vlastiti gate. Brojke dolje su premjerene 20. 9. 2026. naredbama git rev-list --count HEAD po repozitoriju, ./flora status i ./flora check (16 h); uz svaku stoji što je ovdje pisalo do 20. 9. Dvije promjene nose više od brojke: flora-infra je s 65 otišao na 94 commita, a zaglavlje je do 20. 9. tvrdilo da su svih deset u koraku s remoteom — ./flora status 20. 9. kaže differs za flora-atlas, flora-infra, flora-core i sync-nexus, dakle četiri repozitorija imaju lokalno ono što na GitLabu nije.

RepozitorijCommitaPovijest doGateGitLab
flora-core
Vendure + wp-venture-sync
625
26. 9. · bilo 584 (24. 9.)
20. 7.prolazi
348 dat. / 3.596 testova
24. 9. · bilo 346 / 3.531 (20. 9.)
pushan
20. 9. HEAD ispred remotea
flora-atlas
znanje u šest mapa
545
26. 9. · bilo 536 (24. 9.)
20. 7.prolazi
187 poveznica
20. 9. · bilo 145
pushan
20. 9. HEAD ispred remotea
sync-nexus
PHP nadzor zaliha
186
180 bez mergeva
20. 9. · bilo 185 / 179
11. 9.prolazi
650 testova, 0 palo
pushan
www-plant-garden-si
Astro + Sveltia + otočići
200
192 bez mergeva
26. 9. · bilo 150 / 143 (24. 9.)
17. 8.prolazi
123 dat. / 0 grešaka, 86 testova, 1.712 stranica
24. 9. · bilo 124 / 78 / 1.724
pushan
18. 9. navečer — do tada je stajalo „čeka odluku"
flora-libs
@flora/client + legal-tooling
18
26. 9. · bilo 9 (24. 9.)
17. 9.prolazi
76 testova
pushan
flora-base
meta: flora CLI i TUI
71
26. 9. · bilo 67 (23. 9.)
17. 9.prolazi
67 testova (node tests/run.mjs)
23. 9. · bilo 33 (20. 9.)
u kontejneru 52/67 — slika nema git
pushan
flora-samples
zamrznuta arhiva
117. 9.nema gateapushan
flora-infra
OpenTofu + Ansible + runner
25. 9. · CI predložak ukinut, svaki repo drži svoj
111
26. 9. · bilo 106 (24. 9.)
17. 9.nema gatea
ali nosi ci/gate.yml, predložak koji ostali includeaju
pushan
www-rasadnik-milic-hr1—skeletpushan
www-plant-garden-hr
Astro, skelet iz probnog reza
12
26. 9. · bilo 7 (20. 9.)
17. 9.prolazi
75 testova
pushan
18. 9. navečer, na vlasnikovu riječ

Skupni gate: ./flora check 26. 9. → 7 prošlo, 1 palo, 2 bez gatea — isti ishod i isti uzrok od 23. 9. naovamo Gateova je sedam, ne osam — flora-base se mjeri dvaput, izvorno i u linux grani; dobio ga je 18. 9. (node tests/run.mjs), i to je jedan od tri ispravka koje je izvedba CI-ja unijela u nalaz. Testova je 5.142: flora-core 3.999, sync-nexus 650, storefrontovi 265 + 96, flora-libs 66 (pao s 92 jer je manifest API uklonjen), flora-base 66; flora-atlas ne broji testove nego 187 poveznica. Do 20. 9. je ovdje pisalo 6 prošlo, 2 palo, 2 bez gatea, 4.377 testova i 145 poveznica — mjerenje od 18. 9. u 22 h. Zeleno nije zasluga popravka: 18. 9. su obje trgovine pale na astro build jer Vendure nije radio, a 20. 9. je radio.

23. 9. gate opet nije čist, i pada nešto drugo. ./flora check daje 7 prošlo, 1 palo, 2 bez gatea, a testova je 4.477 (flora-base je preko noći s 33 narastao na 67). Trgovine su prošle — Vendure je radio. Palo je flora-base (linux), drugi prolaz istog gatea u kontejneru: 52/67, svih petnaest s porukom spawnSync git ENOENT. Uzrok je slika, ne kod: node:24-bookworm-slim nema git, a testovi za push all i git mod zovu pravi git. Starih 33 testa nisu, pa je kontejnerski prolaz dotad bio zelen; na ovom računalu istih 67 prolazi 67/67.

Ranije, 18. 9.: dva pada koja su bila preduvjet okoline, ne regresija koda. Obje trgovine padale su na astro build s porukom Vendure returned 0 products; at least 1000 product pages are required — Vendure nije bio podignut (lsof -i :3000 prazan, Postgres radi). Testovi i type-check obiju su prolazili; padao je samo korak koji traži živ katalog. To je točno ono ponašanje zbog kojeg je gate trgovina i odvojen: jedini korak u cijelom estateu koji traži živu i napunjenu bazu je astro build.

Za usporedbu: gate monorepa je s 3.497 narastao na 3.507 testova, pa je 18. 9. ujutro mjerio 4.204 u šest gateova, a navečer 4.377 u sedam — flora-core je preko dana dobio 140 testova (3.325 → 3.465), a flora-base je ušao u prolaz sa svojih 33. Do 20. 9. je to ovdje bila i „današnja" brojka; danas je 4.443, jer je flora-core u dva dana dobio još 66 testova (3.465 → 3.531 u 346 datoteka). Ostalih šest gateova stoji nepromijenjeno.

snimka, ne rez flora-libs i flora-samples nemaju prenesenu povijest. Kod flora-libs je to odluka vlasnika: legal-tooling je ondje imao četiri commita, a povijest se gradi od sada. Kod flora-samples je riječ o zamrznutom tuđem materijalu — 15 commita koji ništa ne objašnjavaju.

Tri preimenovanja koja bi tiho pojela povijest najvrjedniji nalaz dana

Rez po imenu mape prenese samo ono što se tako danas zove. Svaka od tri velike mape preimenovana je 31. kolovoza, u jednom commitu s 814 preimenovanja.

Novo imeCommitaStaro imeCommitaIzgubilo bi se
ecommerce/197apps/server291291 commita, 6 tjedana
storefronts/plant-garden.si110samples/cms-si1717 commita, 2 tjedna
storefronts/plant-garden.hr108samples/cms-demo62čeka rez

Kako se zna da je rastopljeno: u flora-core daje git log src/vendure-config.ts 62 commita bez --follow, najstariji 20. 7. U SI rezu public/admin/config.yml ima 19 commita do 17. 8., i 98 danas postojećih datoteka ima prvi commit prije 31. 8.

Kod sync-nexusa i flora-atlasa ista je provjera prošla prazno, pa se činila suvišnom. Kod jezgre je uhvatila najveću moguću štetu.

Pravni manifest: putanja je dio brave promijenilo dizajn

immutableStorageKey se gradi iz putanje, a assertImmutable je uspoređuje s već objavljenim manifestom. Izvedeš li zapisanu putanju iz toga gdje mapa stoji na disku, generator odbije raditi na svakoj već objavljenoj verziji:

Refusing to change immutable legal version cookies:hr-cookies-2026-08-08

Zato raspored (legal-layout.json) ima dva odvojena polja po storefrontu: root — gdje mapa jest, mijenja se slobodno — i manifestPath — što se upisuje u manifest, smrznuto zauvijek.

Dokaz: sva tri generirana manifesta ostala su bajt u bajt ista, i to regeneracijom, ne usporedbom zatečene datoteke. Brava je provjerena i tako da joj se namjerno promijenio manifestPath — odbila je raditi.

Što je držao samo hoisting tri ovisnosti i jedan config

  • @types/node nije deklarirao nijedan radni prostor. astro check ga je nalazio samo zato što ga Vendure povuče u hoistani korijen. Samostalno: 5 × ts(2591) u oba storefronta.
  • vitest nije bio u ecommerce/package.json — nalazio se hoistan iz legal-toolinga i storefrontova.
  • Dvije verzije Vitea. plugin-react 5.0.3 traži vite ^4–^7, vitest 4.1.11 traži ^6–^8. Presjek je vite 7, a vitest na viteu 7 ne emitira metapodatke dekoratora → 9 TypeORM suiteova padne, −76 testova. Lijek: overrides koji vitestu daje vite 8, čime se namjerno reproducira ono što je hoisting radio slučajno.
  • vite.config.mts je posezao izvan repozitorija (../node_modules/lodash-es). Popravak nije ./ — to bi puklo u monorepu — nego pogledati oba mjesta.

Svih 47 raspona verzija je pinnano točno, a lockfile je ostao na 1.796 paketa — stablo se nije pomaknulo.

Što git ne nosi, rez ne nosi zagrizlo dvaput

Ignorirane datoteke ne putuju ni s jednim rezom. To se ne vidi kao greška: server se digne, API odgovara, a nešto tiho nedostaje.

ŠtoKolikoPosljedicaStanje
ecommerce/.env746 Bflora-core se ne dižeprekopirano
static/assets/444 MB, 9.036 dat.svaka slika proizvoda je slomljena ikonaprekopirano
static/email/18 MB, 709 dat.predlošci i dev poštaprekopirano
static/gls-labels/3,8 MB, 37 dat.ispisane adresniceprekopirano
static/woo-imports/219 MBarhiva uvoza, nitko je ne čita u radunamjerno ostalo
wp-venture-sync/ansible/inventory.yml+ backupiprodukcijski inventorysamo u new-startu
samples/sales/36 kBnula praćenih datoteka, rez ga ne može nositisamo u new-startu

I baza. Vendure je u flora-core zatekao nov docker volumen i sam izgradio 148 praznih tablica, dok je 893 MB pravih podataka ležalo u volumenu new-starta. Preneseno kopijom PGDATA (oba PG 16, izvor ugašen); izvorni volumen je netaknut i služi kao povratna točka. Nakon prijenosa: 1.547 proizvoda, 82 kolekcije, 21 narudžba.

Contract test cijena odluke da klijent ne živi uz shemu

Shema je u flora-core, klijent koji je prati u flora-libs — promjena više nije jedan commit. Zaštita su dvije polovice:

  • Snimka sheme je commitana uz paket; test paketa provjerava svaki GraphQL dokument protiv nje, bez Dockera i bez baze.
  • Zaseban test u coreu regenerira shemu iz konfiguracije i pada ako je snimka ustajala.

Dokaz da brava radi: shema je namjerno oborena — preimenovan Order.orderNumber — i test je pao s Cannot query field "orderNumber" on type "Order", 2 pala / 48 prošlo. Vraćeno, oba zelena.

Usput nađeno: bez runPluginConfigurations test provjerava izmišljotinu — svaki customFields ispadne goli JSON, i prva je verzija tako lažno prošla.

./flora jedna naredba za deset repozitorija

./flora setup      izaberi repoe, kloniraj, instaliraj — ovisnosti rješava sam
./flora dev        Postgres → flora-core → storefrontovi, s adresama
./flora check      gate SVAKOG repozitorija, njegovom naredbom
./flora data       seed narudžbe, snimke baze, reset kataloga
./flora status     grane, razlika prema GitLabu, gdje je produkcija
./flora app        terminalska aplikacija — sve na jednom ekranu
./flora help

Bez ijedne ovisnosti, jer flora-base namjerno nema package.json: workspace korijen ondje bi hoistao ovisnosti preko repozitorija i poništio cijelu podjelu. Skripte samo dirigiraju npm skripte svakog repozitorija.

./flora data traži da upišeš riječ prije svakog brisanja, ne y/n, a prije velikog brisanja sam snimi bazu. ./flora dev nikad ne dira port koji nije sam otvorio.

Što je ostalo pošteno

  • www-plant-garden-hr je na GitLabu — 26 commitova (29. 9.), ali kao snimka, ne rez s poviješću. Je li to dovoljno ili treba pravi rez i dalje je vlasnikova odluka. Do 29. 9. je ovdje stajalo da nije rezan i da mu kod živi samo u new-startu.
  • www-plant-garden-si je pushan 18. 9. navečer, na vlasnikovu riječ — danas 225 commitova, slovenski i na devu (dev-v2.plant-garden.si). Do 29. 9. je ovdje stajalo „nije pushan, čeka odluku".
  • Korak 6 — treći brend nije počeo. Njegov pravi ishod je popis svega što brendu zatreba a klijent ne nudi.
  • flora-infra nije skelet nego 121 commit: OpenTofu, Ansible, dva runnera i ./run. CI postoji u šest repozitorija, svaki sa svojim pipelineom u .ci/. E2E je Cypress i živi u SI trgovini i jezgri, ne u infri. Do 29. 9. je ovdje stajalo da je infra prazan skelet i da CI ne postoji.
  • Grana production postoji u svih deset repozitorija (git rev-parse origin/production, 29. 9.). Model main = dev, production = živo je dogovoren i ./flora status prati koliko production zaostaje. Ali nijedan job je još ne čita — produkcijskog deploya nema, pa je grana zasad zapis namjere. Do 29. 9. je ovdje stajalo da grana ne postoji nigdje.
  • Nijedna stranica nije otvorena u pregledniku u sklopu provjere; dokazi su gate, build i HTTP odgovori.
  • Posluživana kopija status stranica je ukinuta 18. 9. stanje/status-sites-served/ bila je nasljeđe monorepa, gdje su stranice živjele u docs/ a kopija se posluživala iz samples/. Kad su obje završile u istom repozitoriju a ništa ih nije posluživalo, ostala je samo obveza da se drže u koraku. Sad postoji jedna mapa; kad zaživi pravo posluživanje, pokazuje na nju.