VM Wolf — Projekto Žemėlapis
OpenWolf žinių valdymo sistema
🕸 Grafas ← Grįžti į VM
Paskutinis atnaujinimas: ← skaityti faile

VM Projekto Cerebrum — Gyvas Žinių Žemėlapis

> [!info] Apie šį failą

> Tai gyvas projekto žinių žemėlapis. Kiekvieną sesiją Claude automatiškai atnaujina šį failą.

> Skaityti prieš rašant bet kokį kodą. Žr. [[anatomy]] failų struktūrai.

Paskutinis atnaujinimas: 2026-08-14

⚠️ KRITINĖ PASTABA — lygiagretūs/negyvi kodo keliai index.html Gamybos ekrane

Prieš liečiant „Gamyba“/„Gavimai“ ekranus, PATIKRINK switchTab(tabName) (~3191 eil.) dispatch'erį, kad žinotum, kuris variantas TIKRAI pasiekiamas:

  • GYVAS (pasiekiamas iš šoninio meniu „Gamyba“): switchTab('gaminama')fetchProductionData()filterByTipas(tipas) (~2448 eil.: visi/paketeliai/pauchai/stickai/gavimai/rezervacija/maisomi) → renderProductionRows() / renderGaminamaGavimaiLentele() / renderRezervacijaWidescreen() / renderMaisomiGaminamoje().
  • NEGYVAS/nepasiekiamas iš šoninio meniu: switchTab('gamyba')renderGamybaTab()_renderGamybaLangas() (~4050 eil.) — joks šoninio meniu mygtukas nesiunčia tabName='gamyba' (tikrasis naudoja 'gaminama').
  • Panašiai — DU „Gavimai“: _zpRender() (~6972 eil., „Žaliavų gavimai ir partijos" — žaliavų LOT/EXP) vs renderGaminamaGavimaiLentele() (~2517 eil., TIKRASIS per filterByTipas('gavimai') — gamybos kortelių plėvelės/dėžučių statusas). Skirtinga paskirtis, abu turi „Gavimai" pavadinime.
  • Rasta 2026-07-29 (task #63/#65) — Agy ir Claude iš pradžių pridėjo pagalbos ženkliuką į NEGYVĄ _renderGamybaLangas(), kuris niekada nepasirodydavo vartotojui. Prieš tvirtinant „X ekranas patikrintas" — visada patikrinti per REALŲ navigacijos kelią (switchTab/filterByTipas), ne vien grep'u rastą panašiai pavadintą funkciją.

    ⚠️ ATNAUJINTA 2026-07-29 (bandant #67 švarinimą) — REALYBĖ SUDĖTINGESNĖ, NEI ATRODĖ, NETRINTI SKUBOTAI: renderGamybaTab()/_renderGamybaLangas() turi 21 iškvietimo vietą index.html, ne tik vieną negyvą įėjimo tašką. Bandžiau (Claude) šią užduotį atlikti pati (vartotojui nebuvo prie kompiuterio), bet RADAU, kad dauguma iškvietimų yra išsibarstę po korteles-veiksmų handlerius (ištrynimas, PALAIDI perjungimas, „Pradėti gamybą" ir pan.) kaip atgalinio atnaujinimo (refresh) šalutinis efektas, ne tik pati navigacija — todėl NENUTRAUKIAU darbo be pilno kiekvienos vietos patikrinimo:

  • Saugiai negyva (tinkamai apsaugota if (activeSidebarTab === 'gamyba'), kuri REALYBĖJE niekada netampa true, nes joks mygtukas nesiunčia 'gamyba'): pvz. ~5041-5042 eil.
  • ✅ IŠTAISYTA 2026-07-29: ~5132 eil. (kortelės ištrynimo handleris) klaidingai tikrino activeSidebarTab === 'gaminama' (TIKRĄJĮ, gyvą tabo pavadinimą!) vietoj 'gamyba' — todėl ištrynus kortelę GYVAME Gaminama ekrane, šis kodas TIKRAI suveikdavo ir perrašydavo konteinerį negyvo _renderGamybaLangas() turiniu. Pašalintas visas nereikalingas blokas (žr. 3 punktą žemiau).
  • ⚠️ DAR NEIŠTAISYTA — reikia tolimesnio darbo: ~5068 eil. (pradėti-gamyba sėkmės handleris) BE JOKIOS SĄLYGOS kviečia _renderGamybaLangas(...) po fetchProductionData() — vykdoma VISADA, nepriklausomai nuo activeSidebarTab. Nepatikrinau realiu naršyklės testu, ar tai realiai matomas glitch, ar praktiškai nekenksminga (galbūt kitas re-render iškart perrašo). Prieš keičiant — būtina realiai naršyklėje patikrinti (paspausti „Pradėti gamybą" gyvame ekrane, stebėti ar kortelių sąrašas trumpam „šoktels"/pasikeičia į kitą išvaizdą).
  • Iš viso liko ~19 kitų iškvietimo vietų nepatikrintų individualiai — KIEKVIENĄ reikia patikrinti atskirai (ar guard'as teisingas, ar iškvietimas besąlyginis) prieš darant bet kokį trynimą. Tai NĖRA vienos eilutės pakeitimas — planuok atskirą sesiją SU vartotoju prie kompiuterio, kad būtų galima iškart patikrinti kiekvieną pakeitimą realiame naudojime.
  • Pamoka: net kai dispatch'erio lygyje kelias atrodo aiškiai „negyvas", pagalbinės/refresh funkcijos gali JĮ VIS TIEK iškviesti iš kitų, gyvų vietų kaip šalutinį veiksmą — visada grep -c VISŲ iškvietimų PRIEŠ sprendžiant, ar saugu trinti, ne tik pagrindinio navigacijos kelio.
  • 2026-08-14 sesija — /inv komanda, 2 realūs production bug'ai, važtaraščio 2 naujos funkcijos, OmniRoute atsisakymas, atostogų paruošimas

    Nauja /inv slash komanda (.claude/commands/inv.md) — pilnas inventorizacijos-per-nuotraukas workflow su sprendimų medžiu: (a) LOT jau DB+sutampa→nieko, (b) tuščias LOT placeholder+kiekis sutampa→backfill (PUT /api/gavimai/:id, kiekio nekeisti), (c) tikrai naujas LOT→nauja partija (POST /api/papildyti-zaliava/:id), (d) LOT yra bet kiekis nesutampa→klausti, nekeisti tyliai. Per sesiją realiai panaudota ~15 kartų (Vitamin A/B6 placeholder skaidymas į realius LOT'us pagal vartotojo fizinį pallet-tikrinimą, Licorice/Antilles Cherry likučio korekcijos, naujos žaliavos „Green Tea Extract 50% EGCG" sukūrimas kai paaiškėjo, kad tas pats LOT numeris atsitiktinai sutapo su kitu, nesusijusiu produktu).

    FEFO nurašymas gali neatitikti realaus fizinio atidarymo — sistema sąmoningai nurašo pagal ankstyviausią galiojimą (žr. 2026-07-29 įrašą žemiau), bet jei vartotojas FIZIŠKAI atidarė kitą (pvz. anksčiau gautą) partiją, reikia rankinio perkėlimo tarp partijų (viena grąžinama į pilną, kita sumažinama tuo pačiu kiekiu, zaliavos.likutis perskaičiuojamas kaip SUM). Realus atvejis: Lemon Juice powder 637/319-92 (FEFO nurašė) vs AN25604950 (realiai atidaryta) — 5,17kg perkelta.

    Bug #1 — plevelesGauta() niekad neužpildydavo planuojamas_kiekis (gamybos_ciklas.js): auto-sukurta kortelė (mobile „Priimti") visada gaudavo planuojamas_kiekis=0, ir šis metodas — nors registruoja LOT/EXP/žurnalą — niekad nepataisydavo plano net gavus realų plėvelės kiekį. Pasekmė: maišymo kortelė rodydavo „Pagal planą (0 vnt)", PAKETELIAI laukas neužsipildydavo. Pataisyta — jei planuojamas_kiekis===0, gauto kiekio registravimas jį automatiškai užpildo (esamo rankinio plano neperrašo). Patikrinta REALIU naršyklės testu per Orca (MAGNESIUM CITRATE kortelė, planas 0→163000, matoma maišymo kortelės modale).

    Bug #2 — mobili dėžučių registracija VISADA klaidos „Nurodykite gamybos kortelę" (public/mobile.html): dėžučių/pouch registravimas kvietė seną /api/priimti-medziagas, kuris dėžutėms neturi jokios paieškos pagal produkto pavadinimą — reikalauja korteles_id, kurio forma net nesiunčia (tik pavadinimą). Kodo komentaras KLAIDINGAI teigė, kad jau eina per registruotiGavima() — buvo suplanuota, bet niekad nebaigta. Pataisyta — perjungta į /api/registruoti-gavima (auto-paieška/auto-sukūrimas pagal pavadinimą, jau seniai veikiantis kitiems atvejams).

    Nauja funkcija — Sąskaitos numeris važtaraščio Istorijoje: kiekvienoje eilutėje laukelis (auto-save onblur), užpildytas → žalias rėmelis + ✅. Nauja vaztarasciai.saskaitos_numeris kolona (tiesioginė SQLite migracija, ne per PocketBase schema — tas pats modelis kaip created/updated), PATCH /api/vaztarasciai/:id/saskaita.

    Nauja funkcija — Nestandartinis (laisvo teksto) važtaraštis: trečias Važtaraštis sub-tab'as „✍️ Nestandartinis" — vartotojas ranka įrašo gavėją + laisvą tekstą, be produktų/LOT/palečių builderio. Sandėlio NELIEČIA (jokio isvezimai/nurašymo). Gauna savą VM-numerį, Istorijoje su „✍️ LAISVAS TEKSTAS" ženkliuku. Reikėjo ATSKIROS, paprastos HTML atšakos IR serverio /api/vaztarasciai/:id/html (peržiūrai), IR klientinėje vzBuildVaztarastisHtml (PDF/spausdinimui) — abi funkcijos anksčiau besąlygiškai tikėjosi payload.paletes masyvo.

    Orca embedded naršyklė — patikrinimo metodo atnaujinimas (žr. [[feedback_orca_cli_usage]]): ankstesnė 2026-08-01 išvada „nepatikimas, tikrinti Node skriptu" PAKEISTA — šiandien pilnai veikė realiam UI testavimui (snapshot→fill/click→keypress Tab blur→tikrinti DB), naudojant DABARTINĘ (orca skills get orca-cli) sintaksę, ne seną --page/--timeout. Naudota 3 kartus šią sesiją sėkmingai (sąskaitos numerio laukas, maišymo plano bug fix, nestandartinis važtaraštis).

    OmniRoute MCP serveris pašalintas (claude mcp remove omniroute) iš C:/VM projekto — buvo palikta registracija ~/.claude.json, kiekvieną sesiją bandanti jungtis į localhost:20128 (503, nebenaudojamas nuo 2026-08-14, žr. [[project_omniroute_valdymo_setup]]).

    Atostogų (2 sav.) paruošimas — kritinė spraga rasta: anksčiau sukurtas SYSTEM-lygio VM-AutoStart scheduled task BUVO DINGĘS (nežinia kodėl). Pataisyta be admin teisių (UAC blokavo Register-ScheduledTask/Set-LocalUser): (1) Startup aplanko .lnk (veikia nes Autologon jau įjungtas), (2) VM-Watchdog scheduled task kas 5 min (vartotojo-lygio, ne SYSTEM — tikrina HTTP+procesą, restartuoja per start-background.ps1 jei negyva). Admin teisių reikalaujantis veiksmas, kurį vartotojas atliko pats: vm lokalios paskyros slaptažodis buvo PASIBAIGĘS (2026-07-31) — SSH/RDP fallback nebeveiktų; Set-LocalUser -PasswordNeverExpires $true sutvarkyta.

    Vartotojo skundas: barkodų (GS1) skaitymas iš telefono foto nepatikimas — teisingas skepticizmas. GS1 parseriai (gs1js ir pan.) sprendžia TIK jau-iššifruoto barkodo teksto parsinimą, NE vaizdo dekodavimą iš pikselių — realioms sandėlio nuotraukoms (Telegram kompresija, kampas, šešėliai) reikėtų atskiro image-decoding sluoksnio (ZXing/jsQR), kuris irgi nepatikimas tokiom sąlygom. Dabartinis vision-modelio spausdinto teksto skaitymas (kaip visą šią sesiją) realybėje patikimesnis.

    Commit'ai: 3cee267 (feat: sąskaitos nr.), 3f001eb (fix: mobili dėžučių registracija), 3298b37 (fix: planuojamas_kiekis), bad7219 (feat: nestandartinis važtaraštis).

    2026-08-12 sesija — Maišymų žurnalo eilutės paspaudimas rodo to maišymo žaliavas

    Naujas endpoint GET /api/gamybos-korteles/:id/nurasymai (server.js) — VIENOS kortelės nurašymai tiesiai iš SQLite (šaltinis), LEFT JOIN zaliavos (pavadinimas/vienetas), ORDER BY rowid. Skirtingai nei /api/nurasymai, kuris skaito PocketBase veidrodį ir gali būti atsilikęs.

    Ryšys: nurasymai NETURI maišymo sesijos FK — maišymo žurnalo įrašo gamybos_zurnalas.data TIKSLIAI sutampa su to maišymo nurašymų nurasymai.created (abu rašomi iš to paties serverio formattedDate, sekundės tikslumu; galioja IR web registruoti-maisyma, IR telegram apdorotiMaisyma). Grupuojant pagal created, vienareikšmiškai atskiriami skirtingi tos pačios kortelės maišymai (patikrinta: BIOCINKAS A260622 — 4 maišymai → 4 grupės; VENOLEGS A260721 — 8 žaliavos). Paskirstytų maišymų kitoms kortelėms atitikimo nėra — rodoma „nerasta" (normalu).

    UI (desktop _renderGamybaKortele „Maišymų žurnalas" lentelė): kiekviena eilutė dabar paspaudžiama (cursor:pointer, ▾ chevron) — onclick="toggleMaisymoIrasas('')" varto paslėptą su _maisymoZaliavosHtml(m) — žaliavų lentelė (Žaliava | Kiekis | Dalis %), rūšiuota pagal kiekį mažėjančiai. nurByCreated mapa sukuriama iš naujo nurRes fetch'o Promise.all'e. maisRows blokas (~5722) yra NEGYVAS kodas (niekur neinjektuojamas) — paliktas. Mobile atitikmens nėra.

    2026-08-03 sesija — mobile Foto analizei bug fix, keli veiksmas-string atitikimo bug'ai (POUCH/SUDĖTA/tuščias pavadinimas), rankinis DB atsekamumas per nuotraukas

    Kontekstas: ilga sesija, daug realaus laiko duomenų taisymo per nuotraukas (žaliavų etiketės, važtaraščiai) + kelių savarankiškai atrastų (ne vartotojo pranešto) production-logikos bug'ų taisymas. Agy dirbo per Orca lygiagrečiai iki pasiekė naudojimo limitą („Individual quota reached... 166h") — po to visą likusį darbą (nuotraukų tikrinimą, DB taisymus, bug fix'us) atlikau viena.

    Mobile „Foto analizei" siuntimas rodė „Klaida" be priežastiessafeFetch() (mobile.html) turėjo kietai koduotą 10s timeout VISIEMS API kvietimams; nuotraukos base64 duomenų siuntimas per mobilų ryšį kartais užtrukdavo ilgiau, timeout tyliai virsdavo neinformatyviu pranešimu. Pridėtas nebūtinas timeoutMs parametras safeFetch()/apiAction() (default 10000 nepakito), submitPhotoAnalizei() naudoja 45000ms. Agy pridėjo Užsakovo (#mPhotoKlientas) pasirinkimo lauką prie formos, /api/mobile-foto backend'as papildytas priimti/išsaugoti klientas_id+klientas_pavadinimas sidecar JSON faile.

    Trys atskiri „veiksmas string atitikimo" bug'ai, visi ta pati bendra klasė (kai kodas skirtingose vietose skirtingai tikrina gamybos_zurnalas.veiksmas reikšmę, ir pamiršta variantą):

    1. getIngBatch() tuščio pavadinimo spąstas (_renderGamybaKortele ir dubliuota kopija ~11885 eil.) — fallback paieškos sąlyga ingPavLC.includes(g.pavadinimas...) niekada netikrino, ar g.pavadinimas netuščias. JS'e bet_kas.includes('') visada true, tad VIENAS DB įrašas su tuščiu zaliava_pavadinimas_raw (nesusijusi BF „Curcum extract" žaliava) klaidingai „atitikdavo" KIEKVIENĄ ingredientą, kuriam realaus LOT nerandama — 5 skirtingi „for Gut bliss" recepto ingredientai visi rodė tą pačią, jiems nepriklausančią partiją. Pataisyta abiejose kopijose — tuščias g.pavadinimas niekad nebelaikomas atitikimu.

    2. POUCH veiksmas praleistas kortelės perskaičiavime (PUT/DELETE /api/gamybos-zurnalas/:id, server.js) — po žurnalo įrašo redagavimo/trynimo, kortelės pagaminta_kiekis/supakuota_kiekis perskaičiuojami TIK jei veiksmas SUDĖTA/STAKLĖS/PALAIDI — POUCH (kuris pouch produktams žymi IR pagaminimą, IR supakavimą vienu metu) buvo visiškai praleistas. Redagavus/ištrynus POUCH įrašo kiekį, kortelė likdavo su sena, nebeatitinkančia reikšme. Pataisyta abiejuose endpoint'uose — pridėtas else if (v === 'POUCH') atvejis, perskaičiuojantis abu laukus iš SUM(kiekis) WHERE veiksmas='POUCH'.

    3. Viršutinis „Sudėta į dėžutes" KPI ignoravo multi-regionų žymas (fetchProductionData(), index.html ~2323 eil.) — naudojo griežtą lygybę veiksmas === 'SUDĖTA', bet multi-regionų kortelės (pvz. BIOCINKAS LT+LV/EE) rašo 'SUDĖTA [🌍 LV/EE]' su regiono žyma. Detalės panelis (_kpiPanelLoad) senai naudoja .includes('SUDĖTA') ir šios problemos niekad neturėjo — viršutinis skaitiklis dabar suvienodintas su ta pačia logika. (Pastaba: pagaminta pusėje STAKLĖS ✓ griežta lygybė PALIKTA TYČIA — tai atskira, sąmoningai neskaičiuojama kumuliacinė žymė, ne regioninis variantas.)

    Žr. naują atminties įrašą feedback_veiksmas_string_matching_drift.md — šis bug'ų šablonas (naujas/žymėtas veiksmas variantas pamirštamas VIENOJE iš kelių vietų, kur jis tikrinamas) pasikartojo 3 kartus per šią sesiją, verta jo aktyviai ieškoti ateityje.

    Duomenų atsekamumo pataisymai per vartotojo nuotraukas (DS klientas):

  • Spinach powder: DB likutis 62kg → faktinis pasvertas 57.5kg (vartotojo patvirtinta), pridėtas trūkstamas LOT 210426 (IDA s.r.l., EXP 2027-04-21).
  • GINGER D.E. 5% Gingerols, MILK THISTLE D.E. 80% Silymarin, Peppermint ground Organic — visi turėjo tikslų likutį DB, bet JOKIO partijos (LOT/EXP) įrašo zaliavu_gavimai lentelėje — pridėti trūkstami įrašai (Nutrifoods/Vehgro tiekėjai) NEKEIČIANT likučio.
  • Lemon Juice Powder (Symrise/Diana Food, 92kg, LOT AN25604950) — patikrinta, jau buvo užregistruota nuo 2026-06-15, papildomai užpildyti anksčiau tušti LOT/EXP/tiekėjo laukai.
  • Ferrum receptas sukurtas pilnai (BF, sudėtis Ferrum Taiyo 0.25g + Acerola 17% 0.10g + Gliucidex IT19 0.65g/vnt) po vartotojo pateiktos formulės — nauja žaliava „Ferrum Taiyo (BF)" (likutis 0, dar negauta), 3600 vnt. dežučių gavimas užregistruotas per /api/registruoti-gavima.
  • LABANAKT (jau turėjo receptą) — 3913 vnt. dėžučių gavimas, kuris irgi buvo pakliuvęs į orphaned zaliavos stub prieš vakarykštį Ferrum fix'ą, perregistruotas teisingai per tą patį endpoint'ą.
  • Trūkstamas važtaraštis atgaline data: Creatine Monohydrate (DS, LOT 607021) turėjo 520 vnt. neišsiųsta pagal sistemą, nors vartotojas manė, kad viskas išsiųsta. Iš pradžių atgaline data užregistruotas TIK Creatine (VM-20260731), bet vartotojas atsiuntė TIKRO važtaraščio nuotrauką — jame buvo 4 produktai (Garden strawberry 600, Light caramel 350, Creatine Monohydrate 520, Wild marine collagen 80, iš viso 1550 vnt./53 dėž.). Pirminis nepilnas įrašas ištrintas (vaztarastis+isvezimai+zurnalas), sukurtas iš naujo pilnas su visais 4 produktais. Taip pat pataisyta klaidinga Light caramel (LOT 606047) EXP kortelėje (buvo 2027-04-30, iš tikrųjų 2028-07-27).
  • Mobile UI: prod-kortelės (renderProdCard) gavo naują plonos progreso juostelės elementą, rodantį sumaisytas_kiekis (🧪, oranžinė) tarp pavadinimo/LOT/EXP ir pagaminta/supakuota/išvežta kvadratėlių — pirma versija (4-as kvadratėlis) atmesta kaip per ankšta, perdaryta į juostelę. Desktop'e ekvivalentiška juostelė (mPct, violetinė) jau seniai veikia renderProductionRows() — nieko keisti nereikėjo.

    Atostogų registravimas — UI grupavimas + reali duomenų klaida. submitHR('ATOSTOGOS') (mobile.html) tyčia kuria atskirą darbo_laikas įrašą KIEKVIENAI darbo dienai tarp „nuo"/„iki" (kad mėnesio suvestinė galėtų tiksliai skaičiuoti dienas) — bet „Darbo laikas → Istorija" sąrašas anksčiau rodė kiekvieną dieną kaip atskirą kortelę, todėl viena „nuo-iki" registracija atrodė kaip N atskirų įrašų. Pridėtas grupavimas: iš eilės einančios (leidžiant iki 3 d. tarpą savaitgaliams) to paties darbuotojo ATOSTOGOS dienos dabar rodomos kaip VIENA eilutė „Nuo X iki Y (N d.d.)" su bendru trynimo mygtuku (deleteHRGroup). Patikrinant paaiškėjo IR reali duomenų klaida — rugpjūtį buvo klaidingai užregistruota 20 atostogų dienų (08-03–08-28) vietoj teisingų 10 (08-17–08-28); 10 perteklinių įrašų ištrinti, pridėtas trūkstamas 08-31 TEVADIENIS įrašas. Pastaba sau: registruojant naują darbo_laikas/kitą lietuviškų raidžių turintį įrašą per curl -d "{...Ž...}" Bash/Git-Bash aplinkoje, UTF-8 simboliai (Ž ir pan.) gali sugesti į pakaitos simbolį — po tokio įrašymo VISADA patikrinti tiesiogiai per SQLite, ar vardas/kiti tekstiniai laukai neapgadinti (šįkart pačiam teko taisyti savo paties sukurtą „Justas Žukauskas" → „Justas �ukauskas" klaidą).

    2026-07-31 sesija — dežutės naujo produkto registravimas apeidavo receptą/kortelę (Ferrum), BIOCINKAS trūkumo fix, bendras darbas su Agy per Orca

    Kontekstas: vartotojas pirmą kartą testavo Orca (stablyai/orca) kaip alternatyvą/papildinį wmux daugiaagentei orkestracijai — šis darbas atliktas VIZUALIAI matomas vartotojui, Claude ir Agy dirbo lygiagrečiai per Orca terminalus (Claude — backend, Agy — frontend), su aiškiu darbo pasidalijimu per terminal_send.

    BIOCINKAS klaidingas „Trūksta žaliavų" trūkumas (public/index.html ~2244) — trūkumo skaičiavimas naudojo pagaminta_kiekis (kiek jau pervaryta per stakles), bet žaliavos realiai nurašomos MAIŠYMO metu (patvirtinta nurasymai lentelėje — kiekis tiksliai atitinka sumaisytas_kiekis). Kortelėms, kur maišymas lenkia staklių pažangą (norma gamyboje — sumaišai didelę partiją, po to varai per stakles palaipsniui), tai rodydavo klaidingą trūkumą. Pataisyta į Math.max(0, planuojamas_kiekis - (sumaisytas_kiekis||0)) — ta pati logika, kuri jau seniai naudojama MRP/Rezervacijos skaičiavimuose (likutinisPlanas) kitose šio failo vietose. Patikrinta replikuojant tikslią formulę Node scriptu prieš gyvus DB duomenis (naršyklės įrankiai — ir wmux browser_open, ir Orca embedded tab/eval/wait — buvo nepatikimi/pakabindavo šios sesijos metu, žr. [[feedback_orca_cli_usage]]).

    „Ferrum" naujo produkto registravimas per mobile.html Gavimai formą kūrė „pakabintą" žaliavos įrašą, ne receptą/kortelę — root cause: mobile.html naujo dėžutės/pouch produkto registravimas siųsdavo į /api/mobilus/priimti (server.js ~6624), kuris tiesiog sukuria/atnaujina zaliavos eilutę pagal pavadinimo atitikmenį, VISIŠKAI apeidamas gamybos_ciklas.js registruotiGavima() recepto/kortelės auto-kūrimo logiką (kurią naudoja desktop index.html „Priimti pakuotes" tabas per /api/registruoti-gavima). Pasekmės: (1) produktas neatsirasdavo gamyboje (nėra recepto/kortelės), (2) zaliavu_gavimai lentelėje nieko, todėl Gavimai lango dėžučių stulpeliai tušti, (3) #gKli (Užsakovo) laukas mobile.html apskritai NEBUVO renderinamas dėžutėms/pouch (tik zaliava), tad net jei kelias veiktų, priskyrimo galimybės nebuvo.

  • gamybos_ciklas.js registruotiGavima() — auto-recepto-kūrimo sąlyga (buvo TIK yraPirminePak, t.y. plevele/pouch) išplėsta į (yraPirminePak || tipas==='dezutes'). Naujo recepto INSERT dabar taip pat išsaugo klientas stulpelį iš kliento_kodas parametro (anksčiau visada likdavo tuščias, nepriklausomai nuo tipo).
  • server.js /api/registruoti-gavima — PocketBase recepto sinchronizacija papildyta klientas lauku.
  • public/mobile.html — naujo dėžutės/pouch produkto registravimas dabar eina per /api/registruoti-gavima (ne /api/mobilus/priimti); #gKli renderinamas ir rxType==='dezutes'/'pouch' atvejais.
  • Patikrinta REALIU test-produkto API kvietimu prieš commit'inant (sukurtas recepto+kortelės+klientas įrašas, patikrintas SQL, po to išvalytas iš SQLite; PocketBase pusėje testinis įrašas liko neišvalytas — auth scriptu nepavyko, nekritiška, nes PocketBase yra antrinis mirror, ne skaitymo šaltinis).
  • Orphaned „Ferrum" zaliavos įrašas (kaqq6xs1hr7xwig, likutis 3600) ištrintas iš DB (patikrinta prieš tai — nulinės nuorodos nurasymai/zaliavu_gavimai/ingredientai lentelėse).
  • Paketėlių skaičiaus rodymas paspaudus priėmimo įrašą (public/index.html „Paskutinė veikla" panelė + public/mobile.html „Paskutiniai pajamavimai") — Agy dalis. veiklos_zurnalas.aprasymas formatas yra dalys.join(' · ') (pvz. "Priimta medžiaga · Ferrum · 3600 vnt"), NE dvitaškis+skliaustai — pirma Agy versija naudojo neteisingą regex (niekad neatitikdavo), pataisyta į split(' · ') pagrindu veikiančią logiką su fallback'u senam formatui. Skaičiavimas: kiekis × recipe.pak_dezuteje (kai vnt.), rodoma per showToast.

    Nauja mobile.html skiltis „Visi priėmimai (kompiuteris + telefonas)" (Priėmimo ekranas) — vartotojo klausimas „kaip kompo gavimus rast patogiai mobiliam?". Esamas „Paskutiniai pajamavimai" rodo TIK žaliavas (/api/gavimai, filtruoja veiksmas='Priimta žaliava') — dėžutės/plėvelė/pouch priėmimai iš kompiuterio ten niekad nesimatydavo. Nauja skiltis naudoja jau esantį /api/veikla žurnalą (jokio naujo backend endpoint'o), filtruoja aprasymas.startsWith('Priimta medžiaga'), rodo 💻/📱 šaltinio žymą + paketėlių skaičiavimą paspaudus (showVeiklaGavimasInfo, ta pati split(' · ') logika kaip index.html). Pakeliui rastas ir pataisytas susijęs bug'as: veiklaLog middleware (server.js ~100) rinkdavo produkto pavadinimą TIK iš body.pavadinimas/api/registruoti-gavima siunčia body.produktas, todėl dežutės/pouch įrašai veiklos žurnale likdavo be pavadinimo („Priimta medžiaga · 50 vnt"). Pataisyta else if (body.produktas) fallback'u, patikrinta realiu API kvietimu prieš/po.

    Commit'ai: 8ea4f24 (frontend: paketėliai UI + gKli laukas + endpoint routing), 2124e3f (backend: recepto/kortelės auto-kūrimas dežutėms + klientas), e76be19 (docs), 731ae40 (mobile „Visi priėmimai" + veiklaLog fix).

    2026-07-29 vakaro sesija — mobile priėmimo pertvarka, FEFO, Agy #68

    FIFO → FEFO nurašymas (server.js fifoConsume() ~3539): vartotojas pastebėjo, kad senesnio galiojimo mažas maišas nebuvo nurašytas pirmas. ORDER BY pakeista iš vien data ASC (gavimo data) į FEFO: CASE WHEN galiojimas IS NULL OR ='' THEN 1 ELSE 0 END ASC, galiojimas ASC, data ASC, created ASC — anksčiausio galiojimo partija visada nurašoma pirma, be galiojimo (fallback) — paskutinė.

    „+1 vnt." šiukšlių įrašai gavimuosegamybos_ciklas.js kortelesSukurta() automatiškai rašo kiekis:1 žurnalo įrašą kaip būsenos žymę (Gauta plėvelė/Gauta pouch) kuriant kortelę vien su LOT. Pouch produktams tai VIENINTELIS įrašas (realus kiekis gyvena pakuociu_sandelis) — PALIKTA. Plevelei/stickui tai grynas triukšmas — filtras centralizuotas _gavimoEntriesFor/_mobGavimoEntriesFor (index.html ir mobile.html), 8 patvirtinti šiukšlių įrašai ištrinti iš DB.

    „LOT: —" mobile Paskutiniuose pajamavimuosegamybos_ciklas.js plevelesGauta() rašė į zaliavu_gavimai.serijos_nr sąskaitos numerį (serija), ne tikrą LOT. Pataisyta: galutinisLot || serija || ''.

    Nauji endpoint'ai PUT/DELETE /api/zaliavu-gavimai/:id (server.js ~3879) — pirmi šios lentelės redagavimo/trynimo endpoint'ai; PUT priima {kiekis, serijos_nr, galiojimas, data}, proporcingai koreguoja likutis_kg, kviečia fifoRecalc() jei yra zaliava_id.

    Mobile „Registruoti gautą plėvelę" pilna pertvarka (public/mobile.html): pašalintas produkto DOM mazgą kiekvienam klavišui — mobiliojoje klaviatūra užsidarydavo/laukas prarasdavo fokusą. Pataisyta pagal jau veikusį cardAC() pavyzdį: oninput dabar atnaujina TIK vidinį rezultatų konteinerį (#zalLikBody/#etikListWrap), mazgas nekeičiamas. Patikrinta realiai naršyklėje (DOM mazgo identiškumas prieš/po, document.activeElement).

  • Priėmimo ekranas — gražus pasirinkimo langas vietoj mažų tabų: naujas renderRxPicker() (kaip Telegram bote — 5 dideli mygtukai su ikonom: Žaliava/Plėvelė/Pouch/Dėžutės/Bulk) rodomas pirmiausia įėjus iš „Daugiau" meniu (state.rxPicked flag'as, resetinamas navigate() viduje). Pasirinkus tipą — forma su kompaktiška „🔄 Keisti" antrašte vietoj senojo .tab-bar.
  • Važtaraščio (mobile) stulpelių nesutapimas tarp palečių — kiekviena paletės savo stulpelių pločius skaičiavo NEPRIKLAUSOMAI pagal turinį (be table-layout:fixed), tad skirtingo ilgio produktų pavadinimai pastumdydavo likusius stulpelius nevienodai tarp lentelių. Pataisyta: table-layout:fixed + fiksuoti % pločiai (colW objektas, priklauso nuo allPouch), pavadinimas prireikus laužomas (word-break:break-word).
  • Važtaraščio parašų blokas (Išdavė/Priėmė) suvienodintas su desktop stiliumi — buvo dvi linijos (sena .sign-col{border-top} + nauja border-bottom po vardu), paliktas tik vienas švarus brūkšnys su vardu virš jo.
  • VITAL TITAN COMPLEX (LOT A260430, OF/„Medigate") — pamiršto važtaraščio atgalinis įregistravimas: vartotojas fiziškai išsiuntė 1 paletę (30 dėž. × 840 vnt. = 25200 vnt.) 07-22, bet niekada neregistravo sistemoje (nei vaztarasciai, nei vaztarasciu_juodrasciai, nei žurnalo IŠVEŽTA įrašo). Sukurtas pilnas važtaraštis atgaline data per /api/nurasyti-vaztarasti (numeris VM-20260722), sandėlio likutis atstatytas (172200→147000 vnt.). Pastaba: šio endpoint'o payload item laukai — pakDezeje (vnt./dėž.), dez_dezeje (dėžučių/dėž., >1 kad rodytųsi), viso_vnt (jau paskaičiuotas total) — NE factor/vnt (pastarasis reiškia „nepilnos dėžės" likutį, ne bendrą kiekį).
  • PURIS™ Pea 2.0 pilnas auditas ir likučio korekcija (Agy) — vartotojas pranešė 295kg faktinio likučio vs 355.69kg DB. Prieš korekciją atliktas pilnas visų liepos mėn. kortelių/maišymų/nurašymų auditas (Dark chocolate, Light caramel, Garden strawberry) — visi 100% atitiko receptūras, jokių praleistų įrašų. ~60.69kg skirtumas priskirtas senesnių (geg./birž.) kortelių FIFO nurašymams iš naujos partijos. Likutis atnaujintas į 295.00kg.
  • BF/VM inventorizacijos suderinimo ataskaitos (VM inv.07-22.xlsx → 2 PDF Desktop'e) — pilnas 103-pozicijų suderinimas + atskira trūkumų/perteklių ataskaita. Svarbi vartotojo korekcija: stulpelis „BF" = PATIES vartotojo fizinė inventorizacija (pateikta Biofarmacijai), stulpelis „VM" = įmonės (Vilniaus Maisto) popierinė apskaita — priešingai nei pirminė prielaida.
  • wmux atnaujintas 3.31.0 → 3.37.2, herdr 0.7.2-preview → 0.7.5 (abu per gh release download). Herdr 0.7.5 pridėjo agent prompt/agent wait CLI fasadą tarpprocesiniam agentų valdymui — IŠBANDYTA ir NEVEIKIA iš Claude Code MCP/Bash konteksto Windows'e (PermissionDenied, greičiausiai program-level apsauga nuo išorinių callerių, atitinka dokumentuotą „Direct Terminal Attach: unsupported" apribojimą). wmux pane_list po atnaujinimo TEISINGAI atpažįsta Antigravity CLI (anksčiau visada agents: []).
  • 2026-07-22/23/24 sesijos naujienos

  • Mobile „Žaliavų likučiai" — paieška, klientų filtras, PDF (public/mobile.html): _zalKlientasKodas(z) resolveris nustato žaliavos klientą per klientas_id (case-insensitive palyginimas su state.klientai) SU fallback'u į (KODAS) sufiksą pavadinimas lauke, kai klientas_id tuščias — 72/258 žaliavų neturėjo šio ryšio, tik pavadinime įrašytą kodą. Klientų chip'ų juosta virš sąrašo, PDF generavimas per _buildZalLikuciaiPdfHtml(klFilter) + esamą /api/generuoti-pdf (navy header stilius kaip kiti sandėlio PDF, expiry spalvinimas raudona/oranžinė).
  • Gavimai: maišymas be formalios gamybos pradžios (public/index.html): virtualios (dar nesukurtos kortelės) eilutės pavadinimas dabar paspaudžiamas (⚗ ženklas) — _pradetiMaisymaIsVirtualaus(receptasId) sukuria kortelę per POST /api/gamybos-korteles BE pradeti-gamyba iškvietimo (kortelė lieka gamyba_pradeta=0, statusas laukia), tada iškart atidaro openMaisymaiDetails. Veikia, nes registruoti-maisyma endpoint'as (server.js:2013) nereikalauja gamyba_pradeta=1 — tik kad kortelė egzistuotų.
  • KRITINIS bug'as — 30s auto-refresh išmesdavo iš Maišymo lango: fetchProductionData() (kviečiamas kas 30s per setInterval) turėjo tab-perpiešimo logiką be atvejo _pagrindinisTab==='maisomi' — kritinę į else šaką (renderProductionRows()), nutraukdavo atidarytą maišymo detalų vaizdą atgal į bendrą sąrašą. Vartotojas tai pastebėjo kaip „vien pelę pastumdžius išeina iš maišymo lango" — tikroji priežastis buvo LAIKAS (30s), ne pelės įvykiai. Pataisyta pridedant else if (_pagrindinisTab === 'maisomi') renderMaisomiGaminamoje(); (index.html ~2280).
  • Naujas „Visi" tabas pagrindiniame Gamybos lange: rodo visų tipų (paketeliai/pauchai/stickai) korteles kartu sąraše, bet sugrupuotas ir atskirtas antraštėmis (_tipGrupes sort tvarka: plevele→pouch→stick, groupHeader injekcija filtered.map() viduje pagal tipo pasikeitimą). filterByTipas('visi') naudoja esamą renderProductionRows() (jau apima per else šaką).
  • Maišymo kiekio įvedimas vnt. (ne tik kg) — tiek desktop (_openGamybaMaisymasModal), tiek mobile (openQuickRegister maisymas forma): naujas „arba vnt." laukas, kuris automatiškai perskaičiuoja bazinės žaliavos kg pagal recepto normą (_gmVntToKg() / updateQrVntToKg()), plius „Įrašyti likutį" greito užpildymo mygtukas (planas − sumaišyta). Spausdinamos Maišymo kortelės (openGamybosKorteleGeneratorModal) „Paketeliai" lauko placeholder pataisytas rodyti LIKUTĮ (plan-sumaisyta), o ne visą planą — anksčiau paskutinio maišymo atveju rodydavo klaidinantį pilną planą (pvz. 2000) vietoj realiai reikalingo likučio (pvz. 282), nors backend (GET .../kortele-html?pktCount=) jau seniai teisingai skaičiavo bet kokį įvestą kiekį.
  • Telegram botas — grafinis atnaujinimas (telegram-bot.js): nauja statusDot(pct) funkcija (🟢≥100% / 🟡≥50% / 🟠>0% / 🔴nepradėta) atskira nuo statusIcon() (veiksmo tipas). Panaudota monitoriaus sąraše (lygiuotas blokas su padStart), kortelės detalėje ir daugumoje pranešimų
    grupavimui: informuotiKitus, staklių/pakavimo/maišymo patvirtinimai (4 vietos), trūkstamos žaliavos (grupuota pagal klientą), sandėlio likučiai, naujo prisijungimo įspėjimas. Pridėta progreso juosta inventorizacijos meniu.
  • KRITINIS bug'as — /start rodė per daug jau pagamintų kortelių: getMonitoriausKorteles() SQL filtravo tik statusas != 'archyvuota', bet NE 'baigta' — todėl 17 jau baigtų (bet dar neperkeltų į archyvą) kortelių maišėsi su 8 realiai vykstančiomis. Pataisyta į WHERE k.statusas NOT IN ('archyvuota', 'baigta') AND k.gamyba_pradeta = 1. Pastaba: identiška SQL eilutė egzistuoja IR rodytiSandelioLikucius() (telegram-bot.js:839) — TEN 'baigta' korteles PALIKTI, nes pagaminta/supakuota, bet dar neišsiųsta produkcija YRA sandėlio likutis. Nekeisti tos vietos, jei vėl kils panaši užduotis.
  • TG meniu sugrupuotasmainMenuKeyboard() mygtukai suskirstyti į sekcijas (⚙️ GAMYBA / 📦 SANDĖLIS / 📈 VALDYMAS) su ne-veiksmingomis antraščių eilutėmis (callback_data:'noop', saugiai praryjama bendro answerCallbackQuery prieš if/else grandinę — NEREIKIA atskiro handler'io naujiems no-op mygtukams).
  • wmux atnaujintas 3.23.0 → 3.31.0 (per GitHub release Setup.exe, openwong2kim/wmux repo).
  • 2026-07-21 sesijos naujienos

  • Maišymo kortelė (spausdinama, GET /api/gamybos-korteles/:id/kortele-html) — pridėtas pktl/vnt kiekis: serveris jau skaičiavo pktlPerSession (kiek pktl išeis iš 1 pilno maišymo), bet niekur to nerodė popieriuje. Dabar sekcijos antraštė („Žaliavos — 1 maišymui (485 vnt)") ir kiekvienas pilno maišymo checkbox tinklelio langelis rodo tikslų vnt. skaičių. Nauja kintamoji perMaisymoLabel (server.js ~7213).
  • Naujas DS receptas „Elektrolitai" (a479aaix8cl4dqo, 5.17g/pkt, plevelė) — sukurtas iš vartotojo pateikto skaičiavimo lapo (screenshot). 11 ingredientų: 2 jau turimi sandėlyje (ANTILLES CHERRY with 25% Vitamin C, Citrinų sulčių milteliai (pfannerschmit) — susieti su esamais įrašais), 9 naujai sukurti su likutis=0, klientas_id='DS' (registruos kai gaus iš tiekėjo). Pastaba: DB jau turi „POTASSIUM CITRATE E 332ii" (DS, 0.7kg) — panašus į naują „Tripotassium Citrate Monohydrate", bet vartotojo lape nefigūravo kaip turimas, tad sukurta atskirai; jei paaiškės, kad tai ta pati medžiaga, reikės sujungti.
  • KRITINIS UI bug'as — modalai netikėtai užsidarydavo pažymint tekstą: visi ~27 public/index.html modalų overlay naudojo click-only guard'ą uždarymui (if (e.target === overlay) ...). Kai vartotojas laukelyje su jau įrašytu skaičiumi bandydavo pele pažymėti (drag-select) tekstą prieš perrašydamas, ir judesys/atleidimas peržengdavo modalo ribas, naršyklė sugeneruodavo click su target===overlay, uždarydama modalą ir prarandant progresą. Pataisyta VISUR: pridėtas overlay.addEventListener('mousedown', ...) guard'as (overlay._downSelf), uždaroma tik jei IR mousedown, IR click buvo ant fono. Patikrinta naršyklėje dispatchEvent testu (drag į foną nebeuždaro, tikras klikas ant fono vis dar uždaro). Naujiems modalams VISADA naudoti šią dviejų-listenerių formą — žr. atmintį feedback_modal_overlay_drag_close.md.
  • 2026-07-20 sesijos naujienos

  • DN „Multivitaminai Vaikams N30" — trūkstamos žaliavos radimas ir taisymas: vartotojas pastebėjo, kad importuojant 07-14 iš Google Drive priėmimo-perdavimo akto, receptas (pdv1pvfrdr74z6n) turėjo 0 ingredientų vietoj 19 — konkrečiai trūko Pyridoxine hydrochloride (DN-01-04, 0.032kg). Pridėta per POST /api/recepto-sudetis su ta pačia proporcinga norma kaip kitos 18 (nekeičiant jų), receptas dabar 19/19, suma 1.501g (vietoj tikslaus 1.5g — nežymus, priimtinas nukrypimas, nes nekeičiant esamų 18 saugiau nei perskaičiuoti visas). Kiti 3 to paties dokumento receptai (Kolageno tripeptidai, Magnio bisglicinatas+B6, Energy Booster) patikrinti — visi pilni, Σ tiksliai = deklaruotam svoriui.
  • TITAN žaliavų trūkumo klaidingas skaičiavimas — rastas ir ištaisytas realus bug'as: užregistravus 2 TITAN maišymus (sumaisytas_kiekis=10500planuojamas_kiekis=226500), Maišymai/Gavimai languose ingredientų trūkumo („Reikia" vs „Turima") skaičiavimas naudojo VISĄ planą, ne LIKUSĮ maišyti kiekį — todėl rodė klaidingą trūkumą daugumai ingredientų, nors fiziškai sandėlyje užtenka likusiai daliai. Pataisyta 3 vietose (_renderGamybaKortele buildIngRow, _korteleDetailHTML, _renderGavimoKortelesDetalus) — visur pridėtas likutinisPlanas = Math.max(0, planas - sumaisyta), naudojamas vietoj grynojo planas. Patikrinta naršyklėje (TITAN kortelė Maišomi vaizde) — visos 12 žaliavų dabar ✅.
  • Nauja funkcija: „Užduoties lapas (pouch)" Maišymai lange — mygtukas rodomas TIK pakuotes_tipas==='pouch' kortelėms, atidaro tuščią spausdinimo šabloną (printPouchUzduotiesLapas(), šalia printGamybosKortele/printPremixLapas): produkto pavadinimas + 4 stulpeliai (Data/Kiekis/Data/Kiekis, dvi poros greta = 32 datų vietos) operatoriaus ranka pildomai kasdienei apskaitai. Pastaba lape paaiškina kiekio įrašymo principą (pvz. „10,05" = 10 pilnų dėžių + 5 vnt. nepilnoje). Jokių DB pakeitimų — grynas spausdinimo šablonas.
  • BF inventorizacijos tęsinys per Telegram (Agy priežiūra, tiesioginis greitas pollinimas aktyvaus darbo metu pagal vartotojo prašymą „labai greitu intervalu") — suvesta ~15 naujų žaliavų (Psyllium, Green Tea, Lactobacillus, Melatonin, Broccoli, Marigold, Vitamin A, Omega3 EPA DHA, Selenium, Resveratrol, RED RICE YEAST, Vitaminas B1/B2/B12/K1, Ascorbic acid) su nuosekliu jauSunaudota formulės ir konservatyvios taisyklės (mažesnysis kiekis, kai pasvertas > DB) taikymu. Visi skaičiai post-factum patikrinti SQL.
  • 2026-07-17 sesijos naujienos

    2026-07-17 popietės/vakaro Agy priežiūros sesija (BF inventorizacijos tęsinys)

    Visos popietės Claude nuolat stebėjo Agy terminalą (daemon-bdb34bc5) per fono agy-watcher.js (buferio tail, ~3-5s aptikimas) + tiesioginį greitą terminal_read pollingą aktyvių serijų metu (vartotojo prašymu — „privalai dažniau ir greičiau reaguoti"), peržiūrint kiekvieną DB-rašymo scriptą prieš tvirtinant („1" tik, niekada „always allow").

    Suvesta ~20+ BF žaliavų per Telegram nuotraukas (Gadomag K, GadoTMC A, TCC M30, Aquamin 10/20kg, Curcum, Chia, Sodium Chloride, Potassium chloride, Senna, Rhubarb, Peppermint, Sucrativ, Blackcurrant, Ginseng, Laminaria, Raspberry, Ascophyllum, Boswellia, Natural Lemon Flavour, L-Methionine ir kt.) — visos su tiksliu jauSunaudota formulės taikymu (PUT /api/gavimai/:id, kiekis_naujas = tikslinis_likutis + jauSunaudota).

    KRITINĖ PAMOKA — kada NULINTI seną partiją, o kada NE (vartotojo pataisa po 3 klaidingų atvejų — Boswellia/Blackcurrant/Aquamin 20kg): Agy (ir Claude, tvirtindama) iš pradžių nulindavo seną partiją KIEKVIENĄ kartą, kai nauja nuotrauka parodydavo tą pačią žaliavą su nauju LOT — tai BUVO KLAIDA. Vartotojo pataisa: „senoji partija turi likt, kame bėdos??? visos nuotraukos ką randu sandėlyje, jeigu vakar pridėjau 10kg kodėl tu sdn nulini". Teisinga taisyklė:

  • Nauja nuotrauka su NAUJU LOT tai pačiai žaliavai = PAPRASTAI papildoma partija ŠALIA senosios (abi lieka aktyvios, bendras likutis = suma) — TAI YRA NORMA.
  • Senos partijos NULINIMAS pateisinamas TIK kai: (a) vartotojas EKSPLICITIŠKAI patvirtina, kad senosios fiziškai nebeliko sandėlyje (pvz. „yra tik šis"/tik viena partija liko), arba (b) tai realus DUBLIKATAS (ta pati partija per klaidą įvesta du kartus / po netinkama žaliava — pvz. GadoTMC A/TMC Fine LOT dublikato atvejis, kuris liko teisingas).
  • Kai neaišku — VISADA klausti vartotojo PRIEŠ nulinant, ne prielaida daryti savaime.
  • Šis pats klaidos-taisymo ciklas kartojosi 3 kartus (Boswellia→Blackcurrant→Aquamin) per vieną sesiją, kol nusistovėjo teisinga taisyklė — žr. [[nulinimo-pattern]] atmintį (atnaujinta).
  • Kitos pastabos:

  • „Konservatyvi taisyklė" (kai pasvertas kiekis > DB likutis, renkamės MAŽESNĮ, t.y. paliekame seną DB reikšmę) — vartotojo įvesta ir taikyta keliems atvejams (Senna, Sucrativ, Raspberry, Ascophyllum, Curcum pirma partija) — GALIOJA TIK kai nėra atskiro vartotojo nurodymo keisti (žr. Glucosamine išimtį, kur vartotojas eksplicitiškai paprašė vis tiek padidinti iki pasverto kiekio).
  • Neigiamo likučio taisymas (Potassium chloride buvo -14.45kg) — sprendžiama kaip normali PUT su nauju kiekis, busena LIEKA 'Aktyvi' po atnaujinimo (patvirtinta serverio logika server.js:3998: naujasLikutisKg > 0 ? 'Aktyvi' : 'Sunaudota' — automatinis, nereikia rankiniu būdu keisti).
  • Sujungimas į tą patį LOT (Natural Lemon Flavour dviejų atskirų partijų, kai vartotojas paprašė „priskirk tampačiam lot") — sprendžiama tiesioginiu SQL UPDATE kiekis/likutis_kg pirmajai partijai, antrosios (tuščio LOT) eilutės pašalinimu.
  • BF inventorizuotų žaliavų PDF ataskaita sugeneruota (C:\Users\justa\Desktop\BF_inventorizuota_2026-07-17.pdf, 28 pozicijos) — vienkartinis scratch scriptas C:\vm\generate_bf_pdf.cjs, savaime išsivalęs po vykdymo.
  • Klientų trumpinių lentelė (BF/SM/DS/IPB/OFF/OF/DN) pridėta į CLAUDE.md kaip nuolatinė taisyklė visiems agentams — vartotojo tiesioginis prašymas Agy.
  • Supervizijos spraga pakartotinai patvirtinta: keli DB-write scriptai įvyko be matomo permission prompt'o (matyt, vartotojas kartais tiesiogiai sąveikauja su Agy terminalu lygiagrečiai su Claude priežiūra, arba veikė ankstesnė "always allow" sesijos apimtis) — visi post-factum SQL patikrinti ir teisingi.
  • 2026-07-17 sesijos naujienos

    Gavimai lango kortelės peržiūros modernizavimas (planas: C:\Users\justa\.claude\plans\kind-chasing-pinwheel.md, vartotojo patvirtintas srautas: eilutės paspaudimas iškart atidaro pilną langą, be tarpinio quick-menu):

  • Vienas būsenos šaltinis: computeGasStatus(card) (public/index.html ~9150) dabar VIENINTELĖ būsenos klasifikavimo funkcija — anksčiau Gavimai lentelės busenaText logika ir computeGasStatus buvo dvi atskiros, nesusietos implementacijos tų pačių reikšmių (rizika, kad ims nesutapti). Praplėsta computeGasStatus „vykdoma" šaka, kad padengtų IŠSIŲSTA/LIKO IŠSIŲSTI atvejus (kuriuos anksčiau žinojo tik busenaText), naudojant tą pačią sąlygų tvarką. „laukia" šakos LAUKIAM PLĖVELĖS atvejis papildomai tikrina _gavimoEntriesFor(card,'dez') sumą (ne tik dezuciu_statusas lauką) — tas pats fallback kaip anksčiau turėjo tik lentelė.
  • _buildGavimaiLentele busenaCellInner dabar kviečia computeGasStatus(card) vietoj savo atskiros logikos. Modalo viduje computeGasStatus skaičiuojama VIENĄ kartą render() pradžioje ir perduodama _korteleDetailHTML(card, recipe, {..., gasStatus}) per opts.gasStatus — pašalintas antras dubliuotas kvietimas.
  • „Info" tabas pašalintasopenKorteleModal — buvo beveik tikslus „Kortelė" tabo (_korteleDetailHTML) poaibis (ta pati metaduomenų lentelė + 3 iš 4 progreso juostų). „Kortelė" liko vienintelis ir numatytasis (šis modalas VIS DAR EGZISTUOJA kode — žr. kitą punktą, kodėl).
  • Pirmoje versijoje eilutės paspaudimas Gavimai tabe atidarydavo šį openKorteleModal popup'ą su veiksmų mygtukais header'yje. VARTOTOJAS PAMATĖ IR ATMETĖ: „tas atsidares meniu nereikalingas, nesamonė... turi būti panašiai kaip Gaminama lange, tik su daugiau redagavimo/informacijos". Pertvarkyta antrą kartą tą pačią dieną — žr. žemiau.
  • Gavimai kortelės vaizdas #2 — inline pilnas puslapis vietoj popup'o (ta pati diena, iškart po pirmos versijos atmetimo; planas atnaujintas tame pačiame kind-chasing-pinwheel.md faile):

  • Nauja funkcija _renderGavimoKortelesDetalus(container, cardId) (public/index.html, prieš _pradetiIsVirtualaus) — stiliumi kaip _renderGamybaKortele (Maišomi tabo referencinis vaizdas): sticky header su „← Atgal į Gavimai", pavadinimas+LOT+EXP+statuso badge (computeGasStatus), veiksmų mygtukų eilutė (Spausdinti/PDF/Maišymai/Etiketės/Baigimo darbai/PALAIDI/Archyvuoti), po to turinio sekcijos: Plėvelė/Dėžutės gauta info (NAUJIENA — anksčiau pasiekiama TIK per lentelės mažus quick-edit langelius, dabar IR čia, per tą patį openGavimoIrasaiModal), 4 progreso juostos, Pakavimo grandinė (su ✎ redaguoti → openPakavimoQuickModal), Žaliavų atsargų tikrinimo lentelė (perkelta iš senojo _korteleDetailHTML), Rankinis Būsenos Keitimas (laukia/vykdoma/baigta), Staklių Darbo Būsena perjungimas, Maišymo kortelė spausdinimas, Baigti Gamybą.
  • Naujas navigacijos kintamasis _ginGavimaiCardId (mirror _ginMaisomiCardId pattern) — renderGaminamaGavimaiLentele() pradžioje tikrina jį ir rodo detalų vaizdą vietoj sąrašo/lentelės. Eilutės onclick dabar _ginGavimaiCardId='...';renderGaminamaGavimaiLentele(); (NE openKorteleModal).
  • openKorteleModal/_korteleDetailHTML PALIKTI KODE, NEPAŠALINTI — antrą kartą tą pačią dieną tyrimas rastas netikslus: openKorteleQuickMenu (kuris pats liko nepaliestas Paketeliai/Pauchai/Stickai tabuose) savo „Kortelė (info)" punkte vis dar kviečia openKorteleModal. Pamoka pakartotinai patvirtinta: PRIEŠ trinant bet kokią funkciją, grep'u tikrinti VISUS callerius, ne pasitikėti ankstesne prielaida, net jei ji jau kartą pasitvirtino kitam atvejui.
  • Patikrinta naršyklėje (wmux browser_evaluate): eilutės paspaudimas atidaro inline vaizdą (sąrašas dingsta, „← Atgal" atsiranda, NĖRA popup/overlay), badge sutampa su lentele keliems skirtingiems statusams, Plėvelė quick-edit langeliai atidaro openGavimoIrasaiModal, Baigimo darbai overlay atidaromas teisingai, „← Atgal" grąžina į sąrašą švariai, jokių konsolės klaidų.
  • Gavimai kortelės vaizdas #3 — GRĮŽTA quick-menu, inline vaizdas lieka pasiekiamas per jį (trečia iteracija tą pačią dieną — vartotojas: „tas langas kuris atsidaro su ta visa info nereikalingas, turi būti paprastas pasirinkimas, kaip Gaminama spaudžiant ant kortelės pavadinimo"):

  • Gavimai eilutės onclick GRĄŽINTAS į openKorteleQuickMenu('${card.id}', event, 'gavimai') — identiškas elgesys kaip Paketeliai/Pauchai/Stickai tabų gr-name-stack pavadinimo paspaudimas (tas pats bendras meniu, ne kažkas atskiro).
  • openKorteleQuickMenu(cardId, evt, context) gavo naują trečią (optional) parametrą context — kai context==='gavimai', meniu punktas „Kortelė (info)" veda į NAUJĄ inline vaizdą (_ginGavimaiCardId='...';renderGaminamaGavimaiLentele();, t.y. #2 versijos _renderGavimoKortelesDetalus); kitur (kai context neperduotas, Paketeliai/Pauchai/Stickai) — kaip anksčiau, į seną openKorteleModal popup'ą. Kitos 4 meniu pozicijos (Maišymai/Etiketės/Baigimo darbai/PALAIDI) tapačios visur, nekeistos.
  • Rezultatas: paspaudus produktą Gavimai tabe — atsidaro TAS PATS paprastas pasirinkimų meniu kaip Gaminama lange (jokio automatinio pilno vaizdo), o pasirinkus „Kortelė (info)" — nuvedama į #2 versijos inline puslapį (kuris savaime NEBUVO atmestas — tik jo AUTOMATINIS atidarymas vien paspaudus produktą).
  • Patikrinta naršyklėje: pavadinimo paspaudimas Gavimai tabe atidaro meniu (5 punktai), „Kortelė (info)" veda į inline vaizdą (jokio popup), Paketeliai tabo pavadinimo paspaudimas VIS DAR veda į seną openKorteleModal (nepaliesta, patikrinta atskirai) — jokių konsolės klaidų.
  • Pastaba ateičiai: šis flow perdarytas 3 kartus per vieną sesiją (popup → inline pilnas vaizdas → quick-menu + inline už jo) — kitą kartą panašaus masto UI pertvarkai verta parodyti trumpą aprašymą/mockup'ą PRIEŠ implementuojant, ne tik po pirmo bandymo realioje naršyklėje.
  • 2026-07-16 sesijos naujienos

    BF/DS fizinė inventorizacija per Telegram — visos dienos Agy priežiūros sesija (Claude nuolat stebėjo Agy terminalą per wmux, tvirtino kiekvieną DB-rašymo permission prompt tik po scripto peržiūros, po kiekvieno write independently patikrino SQL):

  • SPORT JOINTS: 6 trūkstami maišymai (po 75kg bazė) užregistruoti per POST .../registruoti-maisyma (dabar iš viso 16, sumaisytas_kiekis=163264.65). Šie maišymai proporcingai nurašė ir bendrą ingredientą Sipadry-Rice32 (Ryžių sirupo milteliai) — jos partija nswqhq7rlx88bg8 pakoreguota (PUT /api/gavimai/:id su jauSunaudota formule) iki tiksliai vartotojo nurodyto FAKTINIO fizinio likučio 550.00 kg, nepriklausomai nuo FIFO skaičiavimo rezultato.
  • DS Maca powder: rasta ir ištaisyta Agy pačios klaida — rytinis 20kg įrašas buvo klaidingai priimtas kaip SENOS partijos pakeitimas/sumažinimas, ne priedas. Ištaisyta: sena partija (LOT M01O-250916) grąžinta į 273kg + pridėti 20kg = 293kg, antra nauja partija (LOT M01O-251123) 14kg, bendra suma 307kg = 273 (vakar) + 34 (šiandien, 20+14 dviem partijom) — tiksliai atitiko vartotojo nurodytą kiekį.
  • BF žaliavos, patikrintos/suderintos šios sesijos metu (visos su inventorizuota_data='2026-07-16' žyma): Ekologiškas cukrus ECO (2350kg, be pakeitimo, tik žyma), Tri Natrium Citrate/GADOT TSC (partija suderinta iki 850.00kg), Citric Acid E330 (nauja partija AX2-2504-139/550kg sukurta, sena partija THW212126 nulinta pagal vartotojo prašymą — nes „jos kolkas nėra" sandėlyje), TCC M7090/Kalcis (140kg, LOT ištaisytas į 3065359), Glucidex IT 19/Maltodekstrinas (nauja partija LOT 1226352/75kg, sena partija nulinta, rytoj +50kg papildomai žadėta), L-Glycine (SENA-SHEETS placeholder pakeistas tikrais duomenimis, 45kg — vartotojo korekcija, ne 46kg kaip Agy iš pradžių siūlė pagal pasvertą kiekį), Sodium Carbonate/Soda (24.50kg = du atskiri pranešimai 10+14.5kg sudėti), Boswellia serata (10kg).
  • Pastebėjimas ateičiai: kelis kartus DB write įvyko TARP Claude ScheduleWakeup patikrinimų (60-90s intervalas per didelis santykinai su Agy vykdymo greičiu) — scriptas buvo sukurtas IR įvykdytas per vieną Agy „turn", kol Claude dar nespėjo perskaityti permission prompt'o. Visais atvejais rezultatas independently patikrintas SQL POST FACTO ir buvo teisingas, bet tai reiškia, kad realaus laiko „patikrink PRIEŠ approve" garantija nėra 100% — verify-after lieka svarbiausia apsauga.
  • „Nulinimo" pattern pakartotas keliose vietose (Citric Acid, Glucidex): kai sena partija fiziškai nebeegzistuoja sandėlyje, TEISINGAS būdas yra PUT /api/gavimai/:id su kiekis = jauSunaudota (t.y. senas_kiekis - senas_likutis_kg), kas duoda likutis_kg≈0 IŠLAIKANT eilutę DB (audito pėdsakas), NE literalus DELETE FROM zaliavu_gavimai.
  • Žaliavos pakaitalas maišymo kortelėje (kito tiekėjo atveju) — planas: C:\Users\justa\.claude\plans\kind-chasing-pinwheel.md. Vartotojo idėja per BF inventorizaciją: jei receptui priskirtos žaliavos vietoj naudojamas kito tiekėjo analogas, maišymo registravimas turi nurašyti nuo TOS žaliavos, ne recepto numatytosios.

  • Naujas nullable stulpelis gamybos_korteles.maisymo_pakaitalai (JSON {originali_zaliava_id: pakaitalo_zaliava_id}), migracija idiomu kaip faktiniai_duomenys (server.js ~759, ~1414).
  • Naujas endpoint PUT /api/gamybos-korteles/:id/pakaitalas {originali_zaliava_id, pakaitalo_zaliava_id} (pastarasis null = išvalyti). Validuoja, kad pakaitalo žaliava egzistuoja.
  • POST .../registruoti-maisyma (~2069 eil.): prieš nurašymo ciklą skaito card.maisymo_pakaitalai, kiekvienam ingredientui actualZaliavaId = pakaitalai[ing.zaliava_id] || ing.zaliava_idfifoConsume IR nurasymai.zaliava_id naudoja FAKTINĘ (pakaitalo) žaliavą, bazinio ingrediento/santykio paieška lieka susieta su originalia recepto zaliava_id.
  • Spąstas, kurį pagavau IŠ KARTO testuojant: GET /api/gamybos-korteles (~1487 eil.) negrąžina SELECT k.* tiesiogiai frontend'ui — kortelė sudaroma per RANKINIU BŪDU surašytą lauko sąrašą (result = cards.map(card => ({id:..., ...}))). Naujas SQLite stulpelis AUTOMATIŠKAI NEATSIRANDA API atsakyme, kol nepridedamas RANKA prie šio mapping objekto — pridėta maisymo_pakaitalai: card.maisymo_pakaitalai || '' (~1591 eil.). Bet koks naujas gamybos_korteles stulpelis, kurį turi matyti UI, TURI būti pridėtas čia, ne tik migracijoje.
  • UI (public/index.html): buildIngRow (~5005) rodo 🔄 mygtuką prie kiekvieno ingrediento + „→ pakaitalas: X" žymą, jei aktyvus; naujas izoliuotas picker modalas _openPakaitalasPicker/_pakZalAC/_pakZalSel/_savePakaitalas (~5850+, kopija pzZalAC paieškos šablono, NEgeneralizuojant esamo Priimti srauto); _openGamybaMaisymasModal/_gmCalc bazinio ingrediento ). _printZaliavosKlientoPDF() išplėsta: kai nepasirinktas konkretus klientas (code tuščias), naudoja window._selectedZaliavosClient — jei 'bendros' → tik nepriskirtos žaliavos, kitaip ('visi'/default) → BENDRA ataskaita visoms žaliavoms. Abu naudojimo keliai (Klientai tabas su konkrečiu kodu, Žaliavos langas be kodo) veikia per tą pačią funkciją.
  • wmux pane targeting — tylus klaidingas nukreipimas (žr. atmintį feedback_wmux_pane_targeting.md): mcp__wmux__terminal_read su paneId, nustatytu į Agy pane'o ID/ptyId, TYLIAI grąžino MANO PAČIOS aktyvios Claude Code sesijos pty turinį (be klaidos!) — atsakymo ptyId laukas rodė neteisingą pty. Patikima alternatyva: skaityti tiesiai iš C:/Users/justa/.wmux/buffers/.buf (ANSI kodus nuvalius regex'u). terminal_send su explicit ptyId VEIKĖ teisingai (atsakymo ptyId sutapo su prašytu) — problema tik terminal_read pusėje šiame setup'e.

    2026-07-14 sesijos naujienos (commit'ai 03587000702728)

  • Važtaraščiai — Dėžutės UX + rikiavimo fix: „Kiek DĖŽIŲ (kartonų)" ir „Viso vnt. dėžučių" dabar atskiri laukai (anksčiau vienas laukas maišė abi reikšmes) + „Viską" mygtukas užpildo pilną gauto kiekio sumą į vnt. laukelį, nekeisdamas vartotojo įvesto kartonų skaičiaus. Rikiavimo šaknies fix: sąrašas anksčiau rikiuodavosi pagal redaguojamą pristatymo datą (data), todėl naujas nurašymas „paskęsdavo" tarp senų įrašų — dabar rikiuojama pagal TIKRĄ sukūrimo laiką (created). PocketBase kolekcijos schema NEREGISTRUOJA created/updated laukų (senas rankinės migracijos likutis) — pb.create() juos tyliai numeta, todėl /api/nurasyti-vaztarasti juos rašo TIESIOGIAI per SQLite po pb.create(), o GET /api/vaztarasciai irgi skaito tiesiai per SQLite (ORDER BY created DESC), apeinant PB apribojimą. Realus incidentas: BF važtaraštis VM-20260710-2 buvo dubliuotas (vartotojas nesulaukęs sėkmės pranešimo paspaudė „Nurašyti" antrą kartą) — 6 isvezimai + 6 gamybos_zurnalas IŠVEŽTA įrašai buvo dvigubi, likutis dirbtinai sumažintas dvigubai; dublikatas ištrintas, likutis atstatytas.
  • PDF mygtukas kiekvienam važtaraščiui istorijoje: „Visi važtaraščiai" sąraše prie kiekvieno įrašo naujas „PDF" mygtukas (vzDownloadPDFFromHistory) — generuoja PDF iš jau išsaugoto payload, nereikia pirma atidaryti „Žiūrėti".
  • Telegram — žaliavų inventorizacijos meniu (naujas, telegram-bot.js): „🔍 Inventorizacija" pagrindiniame meniu — rodo eilę (pirmiausia niekada netikrintos, tada seniausiai tikrintos žaliavos), pasirinkus žaliavą prašo faktinio (susverto) kiekio, įrašo kaip naują zaliavos.likutis, pažymi inventorizuota_data (nauja SQLite kolona) ir palieka audito įrašą gamybos_zurnalas (veiksmas INVENTORIZUOTA). Skirta palaipsniui (po kelias per dieną) susisverti visą sandėlį.
  • KRITINIS Telegram bugfix — ID su _ laužė action.split('_')[1]: 80 iš 249 žaliavų (visos BF importuotos, id formatas z_bf_...) ir 2 gamybos_korteles turi _ savo ID viduje — senas action.split('_')[1] nukirsdavo ID iki pirmos dalies, DB paieška negrąžindavo nieko. Paveikė 14 vietų (invSel_, monC_, tStart_, editSt_, editPak_, hist_, finish_, confirmF_, mSel_, zSel_, pSel_, dSel_, eL_, dL_, laukia_stakliu_/pakuotes_/log_). Fix: naujas idPart(action) helperis (viskas po PIRMO _, ne split[1]).
  • Gamybos lango pertvarka (3 dalys, uzduotis Agy #28) — planavimo langas „Gamyba" panaikintas iš šoninio meniu, funkcijos sujungtos į „Gaminama" (sidebar dabar pervadinta atgal į „Gamyba", nes senasis pavadinimas atsilaisvino):
  • 1. Maišomi tab → Gaminama (renderMaisomiGaminamoje(), openMaisymaiDetails(cardId)) — naudoja tą pačią _renderGamybaKortele() su nauju gaminamoje parametru teisingam „Atgal" navigavimui; visi refresh taškai (_submitGamybaMaisymas, _baigtGamyba, registruoti-maisyma) tikrina kontekstą (_gamybaCardId vs _ginMaisomiCardId).

    2. Pouch sandėlis → naujas mygtukas Gaminama „Pauchai" tabe (openPouchSandelioModal()), unifikuotas _pouchSandelisRefreshed() atnaujina teisingą kontekstą (senas Gamyba langas ARBA naujas modalas).

    3. PALAIDI žyma pridėta į Gaminama quick-menu (openKorteleQuickMenu) — anksčiau buvo tik senos Gamyba lango kortelėje.

    Senos render funkcijos (_renderGamybaLangas, renderGamybaTab ir kt.) PALIKTOS kode, nebepasiekiamos per UI — pilnas išvalymas atskirai, kai patvirtinta, kad nieko netrūksta realiame naudojime.

  • Rezervacija — „Planuoti gamybą": naujam (dar be kortelės) įrašui mygtukas sukuria realią gamybos_kortele BE lot/exp → pleveles_statusas/dezuciu_statusas automatiškai 'Laukia' (server.js /api/gamybos-korteles logika) — kortelė iškart matoma Gavimai kaip „SUPLANUOTA".
  • PALAIDI archyvavimo fix: „Baigimo darbai" meniu PALAIDI žymos kortelėms (kaip ir pouch tipui) dabar vienas bendras „✅ Gamyba baigta" mygtukas vietoj dirbtinio atskiro „Pakavimas baigtas" žingsnio — PALAIDI siunčiama tiesiai iš pagaminto kiekio, pakavimo iš viso nėra.
  • Infrastruktūra: Agy (Gemini/Antigravity CLI) veikia TAME PAČIAME wmux workspace kaip Claude (pane_list() rodo abu — Agy pane su agentName: null, nes jos signatūra neatpažįstama automatiškai) — Claude gali tiesiogiai terminal_send/terminal_read jos pultą šioje sesijoje, ne tik per agy-uzduotis.md failą. node --watch server.js PERKRAUNA visą procesą (įskaitant telegram-bot.js) po BET KURIO watched failo pakeitimo — sena atmintis „TG boto restart reikalingas atskirai" PASENUSI/NETEISINGA šiam setup'ui.
  • 2026-07-13 sesijos naujienos (commit'ai 4902edc13c5d49)

  • Maišymo kortelė — Premix Su/Be perjungiklis: šalia „Nuostoliai" naujas mygtukų porinys (window._gkPremix, 1=su/0=be), siunčiamas kaip ?premix=0 į /api/gamybos-korteles/:id/kortele-html (serveris jau mokėjo šį parametrą — trūko tik UI). Pasirinkimas išsilaiko tarp kortelių.
  • Gamybos lango kortelė — PALAIDI perjungiklis: naujas „📦 Palaidi" mygtukas veiksmų juostoje (_togglePalaidi()) — uždeda/nuima tag='PALAIDI' per PATCH, įjungiant automatiškai nustato dezuciu_statusas='Gauta' (nebereikalauja plėvelės/dėžučių). Antraštėje geltonas ženkliukas, checklist rodo „Gaminama palaidais — pakuotės nereikia".
  • Etikečių šablonas juoda-balta: .lbl-top/.lbl-bot nebeturi #f2f2f2 fono (spausdintuve virsdavo pilkais taškeliais) — juodos skiriančios linijos vietoj pilkų.
  • Palaidžių etikečių EXP fix: palaidi režimas anksčiau „vnt./pakuotėje" tekstu UŽIMDAVO EXP vietą apačioje — palaidžių etiketės (pvz. SPORT CREATINE) spausdinosi BE galiojimo datos. Dabar kiekis rodomas viduryje, EXP visada apačioje kaip visiems. Pataisyta abiejuose šablonuose (/api/etiketes-laisvos + regioninis openEtiketesModal).
  • Važtaraštis — „Dėžutės" (buvęs „Tuščia tara"): laisvo teksto laukas pakeistas pasirinkimu iš REGISTRUOTŲ dėžučių gavimų (/api/vaztarastis-duomenys naujas laukas dezutes — agreguota iš gamybos_zurnalas WHERE veiksmas LIKE 'Gauta dėžutės%', apima regioninius variantus „(LT)"/„(LV/EE)"). Pasirinkus — LOT/EXP automatiškai; laisvas tekstas liko kaip atsarginė galimybė. LOT/EXP parseris sutvirtintas (senas duomenų kokybės atvejis — dubliuota data be tikro LOT, pvz. SELENE).
  • Važtaraščio PALAIDI eilutės „Dėžučių/dėž." stulpelis: rodydavo recepto MAŽMENINĖS pakuotės reikšmę (pvz. 30), kuri palaidiems neturi prasmės (nėra tarpinio dėžutė→dėžė sluoksnio). Pataisyta šaltinyje (vzAddItemToPallet) IR abiejuose atvaizdavimo keliuose (klientinis vzBuildVaztarastisHtml + serverio prodRow istorijos/archyvo peržiūrai) — pasitaiso ir jau išsaugoti seni važtaraščiai.
  • Rezervacija — tabas vietoj modalo (Agy #35): perkelta iš header mygtuko į Gaminama filtrų juostą (filterByTipas('rezervacija')renderRezervacijaWidescreen()); naujas „Galima pagaminti" MRP stulpelis (min per ingredientus stock/norma, ribojama iki liko) ir „Skirta:" produktų sąrašas žaliavų poreikio lentelėje; sąrašas išsaugomas localStorage.vm_rezervacija_items.
  • DB duomenų atkūrimas iš senos Sheets sistemos (rankinis SQL, ne kodas): SPORT JOINTS receptas visai neegzistavo DB — atkurtas su 9 ingredientų sudėtimi (16,5 g/pktl) iš Excel „SPORT JOINTS MIX"; kortelė LOT D260327 (EXP tikslintas į tikrą 2029-02-28 iš žurnalo), PALAIDI, planas 200 000, pagaminta/išvežta 82 800, 8 istoriniai maišymo įrašai (81 632 vnt). BF žaliavų gavimų (zaliavu_gavimai) LOT/EXP praturtinta iš Excel „Žaliavų gavimas" — 87/89 SENA-SHEETS placeholder įrašų gavo tikrus LOT/EXP/tiekėją (normalizuotas + fuzzy vardų atitikimas).
  • darbo_laikas korekcijos: vasario/kovo mėn. istorija ištrinta (26 įrašai, vartotojo prašymu, po DB backup); liepos 09 sujungta į vieną 4,5 val. įrašą, 07-10 pridėta 4 val. (pamiršta įsirašyti).
  • 2026-07-10 sesijos naujienos (commit'ai 60d3969e2d2f76)

  • NAUJOS DB LENTELĖS: vaztarasciu_juodrasciai (id, pavadinimas, turinys JSON, created, updated) — važtaraščio formavimas dalimis; veiklos_zurnalas (id AUTOINCREMENT, laikas, saltinis, aprasymas) — veiklos istorija, laikoma ~500 naujausių.
  • NAUJI API: /api/vz-juodrasciai GET/GET:id/POST(upsert)/DELETE; /api/veikla?limit= — veiklos sąrašas. X-Saltinis konvencija: mobile.html VISOS užklausos siunčia X-Saltinis: telefonas antraštę (globalus fetch wrapper prie const API); serverio middleware (server.js viršus, po express.json) automatiškai loguoja visus sėkmingus POST/PUT/PATCH/DELETE į veiklos_zurnalas su šaltiniu 💻/📱; TG botas rašo pats ✈️ (maišymai; boto restart reikalingas pakeitimui įsigalioti).
  • Važtaraščio juodraščiai serveryje: mygtukas „💾 Išsaugoti juodraštį" formos apačioje, „Nebaigti važtaraščiai" juosta viršuje su Tęsti/Šalinti; vzApplyDraft() bendras atkūrimas (localStorage F5-draft + serverio); VZ_DRAFT_ID upsert'ui; nurašius — juodraštis auto-trinamas. „Pridėti naują paletę" — pilno pločio mygtukas PO palečių sąrašu + autoscroll prie naujos.
  • Etikečių suvienodinimas (BAIGTA): vienintelis produkto etikečių generatorius /api/etiketes-laisvos; kortelės quick-menu ir kortelės modalo „Etiketės" → openEtiketesForCard() → kompaktiškas modalas su preselect (openEtiketesLaisvosModal(receptasId)); IŠTRINTA _etiketesGeneratorHTML+_spausdintiEtiketes (~200 eil. seno šablono). Šablonas: BE „Maisto papildas", „Laikoma iki +30°C" visiems tipams, vnt./dėžėje kai žinoma. Lapų skaičiavimas visam užsakymui (dėžės=planas/pak_dezeje, 24/lapas, SL—14) + autofill desktop modale ir mobile.
  • Maišymo kortelės bazė TIKSLI: įvedus 80 kg bazės — rodo lygiai 80 kg nepriklausomai nuo nuostolių % (trupmeninis ratio vietoj Math.floor pktl; sveiki pktl tik išeigos label'ui ir pilnų maišymų skaičiavimui) — buildIngRows, gkUpdateIng (index) + pktlPerSessionExact (server kortele-html).
  • KPI patikslinimai: POUCH registravimai skaičiuojasi ir į Pagaminta, ir į Sudėta; KPI detalus panelis nebeskaičiuoja „STAKLĖS ✓" (kumuliacinė užbaigimo žymė, ne produkcija) — sumos sutampa su kortelėmis.
  • Mobile KRITINIAI fix'ai (Agy auditas #30 → mobile-api-auditas.md): maišymo registravimas NIEKADA neveikė (recipe.ingredients vs API ingredientai — 4 vietos); pouch staklės → /registruoti-pouch su {pakeliai} (abu kiekiai kartu); c.busenac.statusas; /api/mobilus/priimti priima body.siuntejas.
  • Važtaraščio vaiduokliniai likučiai fix: /api/vaztarastis-duomenys filtravo statusas != 'archyvuota' — bet archyvavimas žymimas archyvuota DATOS stulpelyje (statusas lieka 'baigta')! Dabar archyvuota IS NULL OR ''. DS išvalyta: Creatine dublikatinis POUCH 280 ištrintas (fiziškai 7 dėžės), 2 senos banana cream kortelės archyvuotos.
  • Spalvoti modalai: Nauja (violetinis)/Etiketės (gintarinis)/Rezervacija (žalias) — gradientinės antraštės kaip Priimti.
  • Infra: GitHub push VEIKIA (gh auth zulikas87, credential helper — paprastas git push); /cm komanda (.claude/commands/cm.md): DB VACUUM snapshot + zip + 7 rotacija _backup_auto/ + commit + push; herdr 0.7.2-preview įdiegtas bandymams (žr. atmintį reference_herdr); Veiklos panelis — 🕘 mygtukas header'yje.
  • 2026-07-09 sesijos naujienos

  • Gavimai (Gaminama) tabas: mygtukas perkeltas prie klientų filtro (.gavimai-btn stilius); rūšiavimo/filtro dropdown (_gavimaiSort: naujausi/seniausi/pavadinimas + tip_* pakuotės tipo filtras); kliento filtras neišmeta iš lentelės (filterByKlientas šaka); archyvuotų kortelių gavimai neberodo virtualių eilučių (LOT/pavadinimas+data match prieš /api/istorijawindow._archyvuotosKorteles); langelių redagavimas PO VIENĄ parametrą (openGavimoIrasaiModal(ref, tipas, laukas), virtualioms — virt:); „planas: X vnt." kai dėžučių negauta; multi-regionų dėžutės rodomos atskiromis eilutėmis langelyje; EXP sutapimo indikacija (žalia = plėvelės/dėžučių galiojimai sutampa, raudona = ne, _expCmp iki trumpesnio tikslumo); nauja būsena GALIMA GAMINTI (žalia, kai visos medžiagos gautos, gamyba nepradėta).
  • Važtaraščio nepilnos dėžės fix: mobile formato payload (vnt = tik laisvi vnt., pakDezeje factor) — nepilna dėžė dabar +1 prie dėžių sk. mobile peržiūroje/viso_deziu ir serverio archyvo HTML (sumMap, prodRow išskaidymas į „Nepilna dėžė" eilutę, palDez). Desktop formatas visada buvo teisingas.
  • POST /api/tg-zinute {chatId, tekstas} + siustiTgZinute() (telegram-bot.js) — laisvos žinutės iš lokalių agentų. Agy užduotis #27: nuolatinis TG foto inbox budėjimas (read-only DB, praneša vartotojui į TG; būsena DRIVE/telegram-foto/_agy_perziureta.json). Agy prompt'ų priežiūra — background watcher (scratchpad agy-watcher.js, seka ~/.wmux/buffers/.buf), žr. atmintį feedback_agy_confirmations.
  • Maišymo kortelė (kortele-html): PREMIX grupavimas — smulkūs ingredientai (<0.25 g/pktl arba <2% svorio, kaip UI _premixSmulkus) rodomi viena PREMIX eilute su sudėties išnaša; išjungimas ?premix=0; negrupuojama, jei bazė — smulkusis.
  • Mobile paieška (cardAC): receptai be kortelės ieškomi includes (ne startsWith), pradžios atitikmenys pirmi — „titan" randa „VITAL TITAN COMPLEX".
  • DB tvarkymas: OF žaliavų migracija UŽBAIGTA (17 žaliavų; Potassium citrate inventorizuotas 730→170 kg — KALIS 650 A260416 gamyba senoje sistemoje nenurašyta); TITAN kortelė sukurta SUPLANUOTA (planas 226 500, LOT A260430); SPORT CREATINE multi-regionai LT 2720 / LV/EE 1840 dėž. (EXP 2027-12-31); Whey Isolete & Creatine tipas pouch→stick; Fiber A260629 užbaigtas ir archyvuotas; HYDRO FORTE / Beef Broth B260611 šiukšlės išvalytos.
  • 2026-07-07/08 sesijų naujienos (dokumentuota 2026-07-08, commit'ai 0404cbef0c8a42)

  • Gavimai lentelė perkelta iš Gamybos lango į Gaminama (b3b6e16): dabar tai Gaminama (pagrindinio) lango tabas _pagrindinisTab === 'gavimai'renderGaminamaGavimaiLentele()_buildGavimaiLentele() (busena spalvų logika ~3174). _gamybaLangasTab liko tik 4 reikšmės (maisomi/paketeliai/pauchai/stickai). Lentelė = gamybos būklės dashboard'as (kaip senas Sheets): viena eilutė = viena kortelė, grupės Plėvelė/Dėžutės/Gamyba + spalvotas Busena stulpelis (SUPLANUOTA/LAUKIAM PLĖVELĖS/GAMINAMA/LIKO SUDĖTI/LIKO IŠSIŲSTI). Virtualios eilutės: produktai su gauta plėvele/dėžutėmis be kortelės rodomi iškart, _pradetiIsVirtualaus() leidžia įvesti planą ir paleisti gamybą vienu paspaudimu. LOT/EXP/kiekio redagavimas tiesiai lentelės langeliuose.
  • Nauja „📋 Rezervacija" funkcija (5d7095ef0c8a42, Gaminama lango skydelis): keli produktai (aktyvios kortelės arba receptai) su planuojamu kiekiu → bendras žaliavų poreikis vs sandėlio likutis, trūkumo paryškinimas. Sumaišyta/Liko rodo „kg — vnt." formatu (vnt. apvalinti), PDF su gulsčio/stačio pasirinkimu.
  • Maišymo kortelės spausdinimo perdizainas (5d7095e): „Viso užsakymui" stulpelis, kompaktiškas pilnų maišymų tinklelis (paskutinis kintamas maišymas — atskira pilna eilutė), LOT/Galiojimas stulpeliai žaliavų lentelėje (iš zaliavu_gavimai).
  • Multi-regionų kortelė BACK TO LIFE LT/LV/palaidi (0404cbe): regiono SUDĖTA registravimas „dėžės.dėžutės" formatu (pvz. 10.20); pataisyta — SUDĖTA žurnalo įrašo trynimas/keitimas dabar perskaičiuoja KIEKVIENO regiono supakuota_kiekis. Važtaraštyje regiono pasirinkimas prekės pridėjime.
  • Važtaraščio juodraščio autosave (35b1443, localStorage): F5 nebeištrina suvesto krovinio, siūloma atkurti. Pridėtas „Dėžučių/dėž." stulpelis PDF lentelėje. Spausdinimo lūžio fix: display:flexdisplay:table „Išdavė/Priėmė" eilutei (flex nepaklūsta page-break-inside).
  • Mobile Priėmimas → Plėvelė (b3b6e16): vieninga produktų paieška (aktyvios kortelės + receptai viename sąraše), sistema pati sprendžia kurti naują kortelę ar priskirti esamą. Pouch veiksmo mapping fix (buvo „Priimta žaliava").
  • 2026-07-05 sesijos naujienos

  • Telegram boto interaktyvus monitorius (3 etapas) (telegram-bot.js): rodytiMonitoriu(chatId, editMsgId?) dabar siunčia VIENĄ žinutę su visų aktyvių kortelių suvestine (iki 12, progress barai + ⚙️/📦 skaičiai) vietoj iki 8 atskirų žinučių. Numerių mygtukai (monC_) atidaro kortelės detales TOJE PAČIOJE žinutėje (rodytiMonitoriausKortele, per editMessageText), su veiksmais (Maišymas/Staklės/Pakavimas/Istorija/Baigti — seni callback'ai nepaliesti) ir ⬅️ Atgal į sąrašą (mon_ref). Nauji callback'ai: mon_ref (atnaujinti/atgal), mon_menu (į pagrindinį meniu). Helper siustiArbaRedaguoti() — edit su fallback į naują žinutę; „message is not modified" ignoruojama. ltLaikas() — Vilniaus laikas HH:MM:SS antraštėje (garantuoja, kad refresh tekstas visada skiriasi).
  • hdr() saugumo pataisa: title/sub dabar escape'inami PAČIOJE funkcijoje (uppercase PRIEŠ escHtml, kad nesulaužytų &). Pataisė latentinius parse bug'us kvietimuose su produktų pavadinimais/vartotojų vardais (eil. ~736, ~932). Taisyklė: į hdr() perduoti GRYNĄ tekstą, ne HTML.
  • Mobile UI v3 — pilnas dizaino modernizavimas (public/mobile.html): nauja dizaino tokenų sistema su dviguba tema (tamsi numatytoji + šviesi per data-theme="light" ant , saugoma localStorage.vm_theme, inline skriptas prieš CSS — flash prevencija). Temos perjungiklis header'yje (#themeBtn, toggleTheme()). Aurora fonas (body::before radial gradientai per --aurora-*), plaukiojantis nav dokas, segmented tab-bar, skeleton shimmer kraunant (.skeleton), pull-to-refresh (setupPTR(), #ptr), haptinis atsakas (haptic() — Telegram WebApp HapticFeedback arba navigator.vibrate), KPI count-up animacija (animateKpiValues(), _kpiAnimated guard), sheet uždarymas braukiant žemyn už rankenėlės (setupSheetDrag()).
  • SVARBU dizainui: visi seni klasių ir CSS kintamųjų pavadinimai IŠLAIKYTI (JS render funkcijos nepaliestos). Nauji tokenai: --c-accent (anksčiau naudotas, bet neapibrėžtas — bug pataisytas), --surface-2, --shadow-card, --shadow-pop, --nav-bg, --nav-active-bg, --sk-shine, --focus-ring, --g-accent. Inline hardcoded rgba(255,255,255,...) fonai JS šablonuose pakeisti į tokenus, kad veiktų šviesi tema.
  • Bug fix: KPI detalės sheet'o paantraštė rodė užkoduotą „Birželio mėn." — dabar mėnuo skaičiuojamas iš state.stats.menuo.
  • Serverio pastaba: po perkrovimo server.js nebuvo pasileidęs (dėl to mobili programa neatsidarė per Tailscale 100.107.91.5:3000) — paleistas rankomis. start-background.ps1 auto-start vertėtų patikrinti.
  • 2026-07-04 sesijos naujienos

  • Telegram foto inbox (C:\VM\DRIVE\telegram-foto\) — vartotojas siunčia botui nuotrauką (žaliavos etiketė) → botas parsisiunčia į šį aplanką kaip foto_.jpg, nustato būseną laukia_foto_kiekio:, laukia kito teksto pranešimo su kiekiu → įrašo .json sidecar ({kiekis, from, chatId, data}) tuo pačiu vardu. Niekada neįrašo į DB automatiškai — tai tik surinkimo mechanizmas, Claude/Agy patikrina rankomis pagal bendrą „žiūrėk nuotrauką“ taisyklę (žr. AGENTS.md).
  • Telegram pranešimų modernizavimasinformuotiKitus/informuotiAdminus ir 5 darbuotojo patvirtinimo žinutės (STAKLĖS/PAKAVIMAS/MAIŠYMAS) dabar naudoja hdr() helperį (antraštė + skirtukas + laiko žyma Europe/Vilnius). informuotiKitus (su darbuotojo vardu) dabar siunčiama TIK Admin/Direktorius rolei, ne visiems aktyviems darbuotojams (privatumo pakeitimas 2026-07-04).
  • Nauji OF (Optifarma) raw materials — pilnai užpildyti realiais likučiais (Acerola, Bamboo, Collagen, Glucosamine, Glycine, Zinc citrate, Sodium hyaluronate ir kt.) po žaliavų likučių analizės (of-titan-likuciai-analize.md) ir Telegram foto gavimų. „VITAL TITAN COMPLEX“ (rec_titan_of) receptas dabar turi visas 12 ingredientų su teigiamu likučiu — gamyba galima (ribojantis faktorius: Glycine, ~262 900 vnt.).
  • BF žaliavų likučių analizė (bf-zaliavu-likuciai-analize.md) atlikta — parodė, kad DAUGUMA BF žaliavų DB yra 0/neigiamos, o Excel rodo daug didesnius teorinius likučius (pvz. Ekologiškas cukrus ECO: Excel 4020kg vs DB 0kg). Migracija dar NEATLIKTA — laukiama sprendimo, kaip tvarkyti.
  • Žr. [[klaidos]] #3 — svarbus pouch kortelių kūrimo per API spąstas (reikia pirma pakuociu_sandelis įrašo).
  • ---

    1. PROJEKTO ESMĖ

    VM (buvęs TMA MES) — gamybos valdymo sistema Daily Spoon (DS) maisto gamybai.

  • Maistiniai papildai (paketeliai, pouchai, stickai)
  • Receptūrų, LOT numerių ir EXP datų sekimas
  • Gamybos kortelių kūrimas ir valdymas
  • Spausdinimas (važtaraščiai, gamybos kortelės PDF)
  • Pakuočių tipai (pakuotes_tipas)

    VertėUI pavadinimasFizinis tipasGamybos būdas |
    |-------|---------------|---------------|---------------|
    'plevele'PaketeliaiSachet — plokščia maža pakuotėPlėvelė ritinyje → staklinė formuoja ir užpildo |
    'pouch'PauchaiPouch — didelė stovinčio maiši pakuotėMišinys pilamas į jau pagamintą maišą iš tiekėjo |
    'stick'StickaiStick — pailga siaura pakuotėPlėvelė ritinyje → staklinė formuoja stick formą |

    > Esminis skirtumas:

    > - plevele + stick → pakuotė formuojama iš plėvelės rulono staklinėje (LOT/EXP ant rulono)

    > - pouch → pakuotė jau pagaminta tiekėjo, gaunama gatava — mišinys tik įpilamas (LOT/EXP ant maišo)

    ---

    2b. GAMYBOS DETALĖS PAGAL TIPĄ

    🎞 Paketeliai (Sachet) — 'plevele'

    Mašinos:

  • Turpack — horizontalaus arba vertikalaus pakavimo
  • x2 = vieno kanalo (1 eilutė), x4 = dviejų kanalų (2 eilutės vienu metu)
  • Plėvelės formatas priklauso nuo staklinės tipo (horizontali/vertikali) ir kanalų skaičiaus
  • Rekomenduojama mašina saugoma recepto lygyje (pvz. "šis produktas byra ant x2, gaminti x4")
  • LOT sistema:

  • Formatas: [Raidė][DDMMYY] → pvz. A260617, B260617
  • Raidė = eilės numeris sąskaitoje (A = pirmoji plėvelė, B = antroji...)
  • Data = gavimo data
  • Vienas LOT = visas gautas kiekis (ne per ruloną)
  • Gamybos eiga:

    1. Plėvelė registruojama gavimo dieną → LOT priskiriamas automatiškai

    2. Staklinė gamina → paketeliai krenta į dėžes → dėžės į paletę → pakavimas

    3. Palaidi variantas: dalis arba visas kiekis — transportinės dėžės (be retail dėžučių)

    4. Svoris tikrinamas pasirinktinai gamyboje, brokas atrenkami pakavime

    Pakavimo info: recepto lygmenyje (kiek vnt. į dėžutę, dėžučių į kartoną ir pan.)

    ---

    🥢 Stickai (Stick) — 'stick'

    Mašinos: Kinų gamybos staklinės (ne Turpack)

    LOT sistema: Tokia pati kaip paketelių ([Raidė][DDMMYY])

    Gamybos eiga: Analogiška paketelių — gali eiti į retail dėžutes arba palaidi transportinėse

    Šiuo metu: nėra specifinių gamybos sunkumų

    ---

    🥤 Pouchai (Pouch) — 'pouch'

    Pildymas:

  • Dalis produktų — rankiniu būdu (dėl byrejimo)
  • Kiti — per aparatą, svoris patikrinamas ant svarstyklių
  • Po pildymo: zip užspaudžiamas → praleidžiamas per heat sealer (viršūnė užklijuojama)
  • LOT/EXP: Nurodo užsakovas (serija + galiojimas). Šiuo metu stampuojama ant kiekvieno poucho. Ateityje — gali ateiti jau su data iš tiekėjo.

    Gamybos kortelė: Užsakovas pasako kiekį + seriją + galiojimą → įvedama ranka sistemoje. Ateityje — failo importas.

    Kokybė: Šiuo metu kiekvienas pouchas pasveramas.

    Pakavimas: Tik transportinės dėžės (didelė gramai → retail dėžučių nėra). Ant dėžių klijuojamos atspausdintos etiketės.

    DS specifika: Užsakovo serija netaikoma — tik EXP data ir kiekis.

    Pouch gamybos kortelės UI pertvarka (Session 4):

  • DĖŽĖS blokas: Pašalintas įprastas retail pakavimo baras. Vietoje jo atvaizduojamas žalias, neinteraktyvus DĖŽĖS blokas, kuris automatiškai skaičiuoja pilnų dėžių skaičių ($\lfloor\text{kiekis} / \text{pak\_dezeje}\rfloor$) bei nepilnos dėžės likutį.
  • PILDYMAS blokas: Gamybos (staklių) baras pervadintas į PILDYMAS (oranžinė spalva, naudoja droplets piktogramą). Jį paspaudus registruojamas pagamintas kiekis.
  • allDone logika: Pouchams užbaigti kortelę pakanka tik staklių pabaigos požymio: allDone = card.stakles_baigtos (vietoj abiejų staklių ir pakavimo baigimo tikrinimo).
  • Kortelių vizualinis stilius UI:

  • Šoninė linija: Vykdomų kortelių šoninė linija/apvadas pakeistas iš mėlynos į oranžinę (laukiančių gamybos kortelių išlieka mėlyna).
  • Spalvų paryškinimas: Info barų (progress blocks) spalvos ir užpildai buvo paryškinti siekiant didesnio kontrasto šviesiojoje temoje. Pažymėjus gamybą arba pakavimą kaip baigtus, atitinkamas blokas tampa žalias su žyma .
  • Kortelės regionai: Multi-region (combo) kortelėse informacija apie atskirus regionus dabar išskleidžiama naudojant display:grid maketą.
  • ---

    2. TECH STACK

    ``

    Backend: Node.js + Express (server.js, --watch hot-reload)

    Frontend: Vanilla HTML/CSS/JS (BEZ TailwindCSS, BEZ frameworks)

    DB: SQLite pb_data/data.db (node:sqlite, DatabaseSync, ES module)

    Alt DB: PocketBase :8090 (kai kurioms kolekcijoms)

    Serveris: localhost:3000

    `

    > [!warning] Svarbu

    > pb_data/data.db — VIENINTELIS DB šaltinis šiame kompiuteryje.

    ---

    3. DB SCHEMA

    gamybos_korteles — pagrindinė lentelė

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT -- FK → receptai.id

    recepto_pavadinimas TEXT -- denormalizuotas pavadinimas

    lot TEXT -- LOT numeris

    exp TEXT -- Galiojimo data (YYYY-MM-DD)

    pleveles_statusas TEXT -- 'Gauta' | 'Laukiama' | NULL

    planuojamas_kiekis INTEGER -- Pouchams: kiek maišų; plėvelei: kiek kg/vnt

    sumaisytas_kiekis REAL -- Kiek kg mišinio jau sumaišyta

    pagaminta_viso REAL -- Kiek iš viso pagaminta

    pakuotes_tipas TEXT -- 'plevele' | 'pouch' | 'stick'

    kliento_serija TEXT -- gamintojo serija etiketėms

    gamyba_pradeta INTEGER -- 0=planavimas, 1=aktyvi gamyba

    busena TEXT -- 'vykdoma' | 'baigta' | 'archyvuota'

    created TEXT, updated TEXT

    `

    receptai — receptūros

    `sql

    id TEXT PRIMARY KEY

    pavadinimas TEXT

    pakuotes_tipas TEXT

    svoris REAL -- Pakuotės svoris (g)

    pak_dezuteje INTEGER -- vnt. dėžutėje

    dez_dezeje INTEGER -- dėžučių dėžėje

    pak_dezeje INTEGER -- viso vnt. dėžėje (computed)

    klientas TEXT -- kliento kodas

    palaidi INTEGER -- 1 = palaidi (be retail dėžučių)

    korteles_tipas TEXT -- gamybos kortelės tipas

    combo_dalybos TEXT -- JSON: dalinimo koeficientai

    pastabos TEXT -- pirkimo pastabos

    uzsakovo_zaliavos INTEGER -- 1 = naudoja kliento žaliavas

    stakliu_rekomendacija TEXT -- rekomenduojama staklinė *(pridėta 2026-06-17)*

    gamybos_pastabos TEXT -- laisvas gamybos komentaras *(pridėta 2026-06-17)*

    -- ⚠️ receptai NETURI 'kodas' kolonos!

    `

    pakuociu_sandelis — pouch sandėlis *(pridėta 2026-06-17)*

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id (pouch tipo)

    kiekis INTEGER NOT NULL -- kiek vienetų gauta

    data TEXT -- gavimo data (YYYY-MM-DD)

    pastabos TEXT -- pvz. "DN92197 — Alpi Eesti"

    created TEXT, updated TEXT

    `

    gamybos_zurnalas — žurnalas

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL

    pavadinimas TEXT

    veiksmas TEXT

    kiekis REAL

    batch TEXT

    created TEXT, updated TEXT

    `

    darbo_laikas — darbuotojų darbo laiko apskaita

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL -- darbo diena (YYYY-MM-DD)

    vardas TEXT NOT NULL -- darbuotojo vardas

    virsvalandziai TEXT NOT NULL -- valandų skaičius (tekstu)

    tipas TEXT -- DARBAS / ATOSTOGOS / TEVADIENIS

    komentaras TEXT -- laisvas komentaras prie dienos (pridėta 2026-08-11; POST/PUT priima, GET grąžina per SELECT *)

    created TEXT, updated TEXT

    `

    > UI (2026-08-11): Mobile „Darbo laikas" istorijoje ir desktop Viršvalandžių ekrane paspaudus dieną, kuri turi komentaras, atidaromas komentaro popup (hrShowComment/vvShowComment). 💬 ženkliukas rodomas prie dienos su komentaru. Desktop forma turi „Komentaras (nebūtina)" lauką (vvFormKom). Telegram boto INSERTai (be komentaro) veikia — kolona turi DEFAULT ''.

    gamybos_dosje — kortelių istorinis archyvas / dosje

    `sql

    id TEXT PRIMARY KEY

    uzsakymo_id TEXT NOT NULL -- susijusio užsakymo ID

    produkto_id TEXT NOT NULL -- produkto/recepto ID

    pavadinimas TEXT NOT NULL -- produkto pavadinimas

    lot TEXT NOT NULL -- gamybos LOT

    galiojimas TEXT NOT NULL -- EXP data

    planas REAL NOT NULL -- planuotas gamybos kiekis

    plevele REAL NOT NULL -- sunaudota plėvelė (kg)

    dezutes REAL NOT NULL -- sunaudotos dėžutės (vnt)

    pradeta TEXT NOT NULL -- gamybos pradžios laikas

    baigta TEXT NOT NULL -- gamybos pabaigos laikas

    stakles REAL NOT NULL -- staklių pagamintas kiekis

    supakuota REAL NOT NULL -- supakuotas kiekis

    isvezta REAL NOT NULL -- išvežtas kiekis

    archyvuota TEXT NOT NULL -- archyvavimo požymis/laikas

    pakuotes_tipas TEXT NOT NULL -- pakuotės tipas

    dosje TEXT NOT NULL -- pilnas dosje tekstas / ataskaita

    html_kortele TEXT NOT NULL -- sugeneruotas kortelės HTML

    created TEXT, updated TEXT

    `

    ingredientai — recepto sudėtis (žaliavos)

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    kiekis_vienai_porcijai REAL NOT NULL -- žaliavos svoris kg vienam maišymui

    created TEXT, updated TEXT

    `

    isvezimai — prekių išvežimo pagal važtaraščius registras

    `sql

    id TEXT PRIMARY KEY

    vaztarascio_id TEXT NOT NULL -- FK → vaztarasciai.id

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    kiekis REAL NOT NULL -- išvežtas prekių kiekis (vnt)

    prekes_pavadinimas TEXT NOT NULL

    lot TEXT NOT NULL

    created TEXT, updated TEXT

    `

    klientai — partneriai / klientai

    `sql

    id TEXT PRIMARY KEY

    kodas TEXT NOT NULL -- unikalus kliento kodas (pvz. EV, BENU)

    pavadinimas TEXT NOT NULL -- pilnas pavadinimas

    adresas TEXT NOT NULL

    email TEXT NOT NULL

    phone TEXT NOT NULL

    papildomi TEXT NOT NULL -- papildoma info (JSON / tekstas)

    created TEXT, updated TEXT

    `

    korteles_regionai — gamybos kortelės paskirstymas regionams (combo)

    `sql

    id TEXT PRIMARY KEY

    kortele_id TEXT NOT NULL -- FK → gamybos_korteles.id

    regionas TEXT NOT NULL -- regiono kodas/pavadinimas

    dezutes_kiekis INTEGER -- planuojamas dėžučių kiekis

    dezutes_exp TEXT -- regiono galiojimo data

    dezutes_gauta TEXT

    pak_dezeje INTEGER -- paketų dėžėje

    pak_dezuteje INTEGER -- paketų dėžutėje

    dez_dezeje INTEGER -- dėžučių transportinėje dėžėje

    supakuota_kiekis REAL -- supakuotas kiekis tam regionui

    isvezta_kiekis REAL -- išvežtas kiekis tam regionui

    statusas TEXT -- regiono būsena

    eilutes_nr INTEGER -- rikiavimo eilės numeris

    created TEXT, updated TEXT

    `

    nurasymai — gamybos metu nurašytų žaliavų registras

    `sql

    id TEXT PRIMARY KEY

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    panaudotas_kiekis REAL NOT NULL -- nurašytas kiekis (kg)

    created TEXT, updated TEXT

    `

    recepto_sudetis — recepto sudėties lentelė (gali dubliuoti/pakeisti ingredientai)

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    kiekis_vienai_porcijai REAL NOT NULL

    created TEXT, updated TEXT

    `

    > [!danger] recepto_sudetis yra NEGYVA/sugadinta lentelė — nulis nuorodų server.js verslo logikoje.

    > Bet senesnės sesijos scenarijaus klaida gali vis tiek į ją įrašyti duomenis (nutiko su HYDRO FORTE 1/2,

    > ištaisyta 2026-07-02, perkelta į ingredientai). Tikrinant "ar receptas turi sudėtį?" — visada

    > patikrinti ABI lenteles (ingredientai IR recepto_sudetis) pagal receptas_id, ne tik ingredientai.

    pakuociu_nurasymai — pouch pakuočių PASTOVUS nurašymas archyvuojant *(pridėta 2026-07-02)*

    `sql

    id TEXT PRIMARY KEY

    receptas_id TEXT NOT NULL -- FK → receptai.id (pouch tipo)

    korteles_id TEXT NOT NULL -- FK → gamybos_korteles.id

    kiekis REAL NOT NULL -- galutinai nurašytas kiekis iš pakuociu_sandelis

    data TEXT NOT NULL

    created TEXT, updated TEXT

    `

    > Anksčiau pakuociu_sandelis "rezervuota" skaičiavimas žiūrėjo tik į AKTYVIŲ kortelių planuojamą

    > kiekį — archyvavus kortelę, jos pouch sunaudojimas "dingdavo" iš rezervacijos skaičiavimo.

    > Dabar laisva = gauta_viso - rezervuota - nurasyta, kur nurasyta = SUM iš šios lentelės.

    > Įrašas kuriamas archyvuoti endpoint'e, PASKUTINIS žingsnis (po galutinio UPDATE) — atomiškumui.

    vaztarasciai — prekių išvežimo važtaraščiai

    `sql

    id TEXT PRIMARY KEY

    numeris TEXT NOT NULL -- važtaraščio numeris

    kliento_pavadinimas TEXT NOT NULL

    data TEXT NOT NULL -- išrašymo data

    siuntejas TEXT NOT NULL -- atsakingas asmuo / siuntėjas

    palečių_kiekis INTEGER NOT NULL -- palečių skaičius

    viso_vnt INTEGER NOT NULL -- bendras prekių vnt kiekis

    viso_deziu INTEGER NOT NULL -- bendras dėžių kiekis

    payload TEXT NOT NULL -- papildomi išvežimo duomenys (JSON)

    statusas TEXT NOT NULL -- važtaraščio būsena

    created TEXT, updated TEXT

    `

    zaliavos — žaliavų sandėlio likučiai

    `sql

    id TEXT PRIMARY KEY

    pavadinimas TEXT NOT NULL -- žaliavos pavadinimas

    likutis REAL NOT NULL -- esamas likutis kg

    vienetas TEXT NOT NULL -- matavimo vienetas (dažniausiai 'kg')

    klientas_id TEXT -- FK → klientai.id (jei žaliava nuosava)

    created TEXT, updated TEXT

    `

    zaliavu_gavimai — žaliavų gavimo iš tiekėjų žurnalas

    `sql

    id TEXT PRIMARY KEY

    data TEXT NOT NULL -- gavimo data

    siuntejas TEXT NOT NULL -- tiekėjas / siuntėjas

    zaliava_id TEXT NOT NULL -- FK → zaliavos.id

    zaliava_pavadinimas_raw TEXT NOT NULL -- žaliavos pavadinimas iš dokumentų

    serijos_nr TEXT NOT NULL -- tiekėjo LOT / serija

    galiojimas TEXT NOT NULL -- tiekėjo EXP data

    kiekis REAL NOT NULL -- gautas kiekis (kg)

    busena TEXT NOT NULL -- gavimo būsena

    created TEXT, updated TEXT

    `

    ---

    4. GAMYBOS CIKLAS

    `

    1. PLANAVIMAS gamyba_pradeta=0 → Gamybos langas

    2. AKTYVI GAMYBA gamyba_pradeta=1 → Pagrindinis langas

    3. BAIGTA busena='baigta' → Istorija

    4. ARCHYVUOTA busena='archyvuota' → Archyvas

    `

    Pouchų workflow

    `

    Gavimas iš tiekėjo → pakuociu_sandelis

    Sandėlio kortelė: gauta / rezervuota / laisva

    Vartotojas įveda LOT + EXP + kiekį

    Sukuriama gamybos_kortele (pleveles_statusas='Gauta' auto)

    Gamybos langas → Maisomi tab

    `

    ---

    5. API ENDPOINT'AI

    🕸️ Sistemos žemėlapis (Wolf)

  • GET /wolf — projekto žemėlapis naršyklėje (tekstinė versija)
  • GET /wolf/graph — interaktyvus D3.js tinklo grafas
  • 📋 Gamybos kortelės (Planavimas ir gamybos eiga)

  • GET /api/gamybos-korteles — gauti visas korteles (aktyvias, planuojamas)
  • POST /api/gamybos-korteles — sukurti naują gamybos kortelę
  • PATCH /api/gamybos-korteles/:id — atnaujinti kortelės duomenis
  • DELETE /api/gamybos-korteles/:id — ištrinti gamybos kortelę
  • POST /api/gamybos-korteles/:id/toggle-pill — įjungti/išjungti gamybos statuso mygtuką
  • POST /api/gamybos-korteles/:id/update-status — pakeisti kortelės būseną
  • POST /api/gamybos-korteles/:id/pradeti-gamyba — pradėti aktyvią gamybą (perkelti iš planavimo)
  • POST /api/gamybos-korteles/:id/registruoti-maisyma — užregistruoti atliktą maišymą (kg)
  • POST /api/gamybos-korteles/:id/registruoti-gamyba — užregistruoti staklių gamybą
  • POST /api/gamybos-korteles/:id/registruoti-supakavima — užregistruoti supakuotą kiekį dėžutėmis
  • POST /api/gamybos-korteles/:id/registruoti-pouch — užregistruoti užpildytus pouch maišelius
  • POST /api/gamybos-korteles/:id/registruoti-pagaminta — tiesiogiai užfiksuoti pagamintą kiekį
  • POST /api/gamybos-korteles/:id/baigti-stakles — pažymėti, kad gamyba staklėmis baigta
  • POST /api/gamybos-korteles/:id/baigti-pakavima — pažymėti, kad pakavimas baigtas
  • POST /api/gamybos-korteles/:id/archyvuoti — perkelti baigtą kortelę į archyvą
  • GET /api/gamybos-korteles/skaidres — gauti duomenis skaidrių / monitoriaus režimui
  • GET /api/gamybos-korteles/:id/atsekamumas — gauti LOT/EXP atsekamumo duomenis
  • GET /api/gamybos-korteles/:id/patikrinti-atsargas — patikrinti, ar pakanka žaliavų sandėlyje
  • GET /api/gamybos-korteles/:id/kortele-html — gauti kortelės spausdinimo HTML ataskaitą
  • GET /api/gamybos-korteles/:id/dosje-html — gauti gražiai suformatuotą A4 portrait formato Gamybos dosjė HTML spausdinimui
  • GET /api/istorija — gauti įvykdytų (baigtų) kortelių sąrašą
  • GET /api/debug/korteles-count — gauti bendrą kortelių kiekį (debug)
  • 🥣 Receptūros ir sudėtis

  • GET /api/receptai — gauti visus receptus
  • GET /api/receptai-list — gauti supaprastintą receptų sąrašą
  • GET /api/receptai-detalus — gauti receptus su papildomais staklių/komentarų laukais
  • GET /api/receptai-gamybai — gauti receptus, paruoštus kortelių kūrimui
  • POST /api/receptai — sukurti naują receptą
  • PUT /api/receptai/:id — atnaujinti recepto pagrindinius/papildomus laukus
  • DELETE /api/receptai/:id — ištrinti receptą
  • POST /api/recepto-sudetis — pridėti žaliavą į recepto sudėtį
  • PUT /api/recepto-sudetis/:id — koreguoti žaliavos kiekį recepto sudėtyje
  • DELETE /api/recepto-sudetis/:id — pašalinti žaliavą iš recepto sudėties
  • 🧪 Žaliavų sandėlis (Likučiai ir nurašymai)

  • GET /api/zaliavos — gauti žaliavų sąrašą su esamais likučiais
  • POST /api/zaliavos — pridėti naują žaliavą į sistemą
  • PUT /api/zaliavos/:id — atnaujinti žaliavos kortelę
  • DELETE /api/zaliavos/:id — ištrinti žaliavą
  • GET /api/zaliavos/:id/panaudojimas — gauti žaliavos nurašymų/panaudojimo istoriją
  • GET /api/zaliavos/:id/gavimai — gauti šios žaliavos gavimų žurnalą
  • GET /api/nurasymai — gauti visų žaliavų nurašymų sąrašą
  • POST /api/papildyti-zaliava/:id — koreguoti žaliavos sandėlio likutį (+/- kg)
  • 🎞️ Medžiagų ir žaliavų gavimai (Pajamavimas)

  • GET /api/gavimai — gauti visus gavimo įrašus
  • PUT /api/gavimai/:id — redaguoti gavimo įrašą
  • DELETE /api/gavimai/:id — pašalinti gavimo įrašą
  • POST /api/registruoti-gavima — užregistruoti žaliavos gavimą iš tiekėjo
  • POST /api/gavimai/bulk — plėvelių rulonų priėmimas (auto-generuoja LOT kodus)
  • POST /api/priimti-medziagas — užregistruoti pakuotės medžiagų sunaudojimą gamybos kortelei
  • GET /api/pakuociu-gavimai — gauti plėvelių ir dėžučių gavimo suvestinę raw formatu
  • 🛍️ Pakuočių sandėlis (Pouch)

  • GET /api/pakuociu-sandelis — gauti pouch pakuočių sandėlio likučius
  • POST /api/pakuociu-sandelis — įvesti naują pouch gavimą iš tiekėjo
  • DELETE /api/pakuociu-sandelis/:id — ištrinti pouch sandėlio gavimo įrašą
  • GET /api/pouch-sandelys — gauti bendrą pakuočių ataskaitą
  • 📦 Važtaraščiai ir išvežimai

  • GET /api/vaztarasciai — gauti visus važtaraščius
  • GET /api/vaztarasciai/:id/html — sugeneruoti važtaraščio HTML peržiūrą
  • DELETE /api/vaztarasciai/:id — ištrinti važtaraštį
  • GET /api/vaztarastis-duomenys — pagalbiniai duomenys naujo važtaraščio kūrimui
  • GET /api/next-vaztarascio-numeris — sugeneruoti sekantį važtaraščio numerį
  • POST /api/greitas-issiuntimas — tiesioginis prekių išsiuntimas nenaudojant gamybos kortelės
  • POST /api/nurasyti-vaztarasti — užfiksuoti žaliavų nurašymą pagal išsiųstas prekes
  • GET /api/isvezimai — gauti prekių išvežimo įrašus pagal važtaraščius
  • GET /api/kpi-isvezta — gauti išvežtos produkcijos KPI ataskaitą
  • 🗺️ Multi-region (Kortelės regionai)

  • GET /api/gamybos-korteles/:id/regionai — gauti kortelės combo regionų paskirstymus
  • POST /api/gamybos-korteles/:id/regionai — pridėti naują regioną kortelei
  • PUT /api/gamybos-korteles/:id/regionai/:rid — koreguoti regiono pakavimo/EXP duomenis
  • DELETE /api/gamybos-korteles/:id/regionai/:rid — pašalinti regioną iš kortelės
  • POST /api/gamybos-korteles/:id/regionai/:rid/registruoti-supakavima — užregistruoti supakuotą kiekį konkrečiam regionui
  • ⏱️ Darbo laikas ir darbuotojai

  • GET /api/darbuotojai — gauti darbuotojų sąrašą
  • POST /api/darbuotojai — pridėti naują darbuotoją į sąrašą
  • GET /api/darbo-laikas — gauti darbo laiko žurnalą
  • POST /api/darbo-laikas — užregistruoti dirbtą laiką / viršvalandžius / atostogas / tėvadienį
  • PUT /api/darbo-laikas/:id — redaguoti darbo laiko įrašą
  • DELETE /api/darbo-laikas/:id — pašalinti darbo laiko įrašą
  • 📖 Gamybos žurnalas

  • GET /api/gamybos-zurnalas — gauti žurnalo įrašus
  • POST /api/gamybos-zurnalas — sukurti rankinį žurnalo įrašą
  • PUT /api/gamybos-zurnalas/:id — redaguoti žurnalo įrašą
  • DELETE /api/gamybos-zurnalas/:id — pašalinti žurnalo įrašą
  • 👥 Klientai

  • GET /api/klientai — gauti klientų sąrašą
  • POST /api/klientai — sukurti naują klientą
  • PUT /api/klientai/:id — redaguoti kliento kortelę
  • DELETE /api/klientai/:id — pašalinti klientą
  • 🖨️ Spausdinimas ir PDF generavimas

  • GET /api/debug/printeriai — gauti sistemoje įdiegtų spausdintuvų sąrašą (Zebra)
  • POST /api/spausdinti-hydraw — išsiųsti ZPL etiketės kodą į Zebra spausdintuvą
  • POST /api/generuoti-pdf — sugeneruoti PDF dokumentą iš HTML šablono
  • 📱 Mobilioji sąsaja

  • GET /mobile — mobiliosios aplikacijos nukreipimas
  • POST /api/mobilus/priimti — priimti ir apdoroti duomenis iš mobiliojo įrenginio
  • ⚙️ Administravimas, importas ir DB priežiūra

  • GET /api/sync-cloud — sinchronizuoti duomenis su debesimi (PocketBase)
  • GET /api/recalc-stats — perskaičiuoti gamybos kortelių rodiklius ir KPI
  • GET /api/dedup-journal — išvalyti besidubliuojančius žurnalo įrašus
  • GET /api/debug/indexes — gauti DB indeksų sąrašą (debug)
  • GET /api/restart-terminal — paleisti iš naujo mobiliojo terminalo tarybą
  • POST /api/admin/restart-pb — perkrauti PocketBase procesą
  • POST /api/admin/sukurti-atsargine-kopija — sukurti atsarginę DB kopiją
  • GET /api/admin/atsargines-kopijos — gauti atsarginių kopijų sąrašą
  • POST /api/admin/db-recovery — atstatyti duomenų bazę iš atsarginės kopijos
  • POST /api/admin/sinchronizuoti-isvezimus — sinchronizuoti išvežimus su išorine sistema
  • POST /api/importuoti-istorija — importuoti istorinius gamybos įrašus
  • POST /api/admin/importuoti-istorija-archyvas — importuoti archyvinius įrašus
  • POST /api/admin/importuoti-vaztarasciai — importuoti važtaraščius iš XLSX failo
  • POST /api/admin/importuoti-gavimus — importuoti gavimus iš XLSX failo
  • POST /api/admin/importuoti-nurasymus — importuoti nurašymus iš XLSX failo
  • POST /api/admin/importuoti-receptu-sudetis — importuoti receptų sudėtis iš XLSX failo
  • POST /api/admin/importuoti-hf-20mb — importuoti didelį žaliavų failą (HF 20MB)
  • POST /api/admin/migruoti-istorija-xlsx — konvertuoti ir migruoti istoriją
  • POST /api/admin/deduplikuoti-nurasymus — išvalyti pasikartojančius žaliavų nurašymus
  • POST /api/admin/trinti-zurnalas-dublikatus — išvalyti besidubliuojančius žurnalo įrašus
  • POST /api/admin/sukurti-gavima — administratoriaus teise sukurti gavimą
  • POST /api/admin/zurnalas-irasas — sukurti naują žurnalo įrašą iš admin pulto
  • PATCH /api/admin/zurnalas-irasas/:id — redaguoti žurnalo įrašą admin pulte
  • DELETE /api/admin/nurasymas/:id — pašalinti nurašymą admin pulte
  • DELETE /api/admin/ingredientai-receptas/:receptas_id — išvalyti recepto sudėtį
  • POST /api/admin/susieti-kortele-receptu — susieti gamybos korteles su atitinkamu receptu
  • POST /api/admin/susieti-receptus — automatiškai susieti receptus
  • POST /api/admin/fix-recepto-sudetis-schema — pataisyti sugadintą recepto sudėties schemą
  • POST /api/admin/repair-recepto-sudetis — pataisyti sugadintus recepto sudėties duomenis
  • GET /api/ataskaita/biofarmacija — gauti Biofarmacijos klientų ataskaitą
  • ---

    6. UI STRUKTŪRA

    Pagrindiniai tabs (activeSidebarTab)

    `

    'gaminama' → Pagrindinis langas (aktyvi gamyba, gamyba_pradeta=1)

    'gamyba' → Gamybos langas (planavimas, gamyba_pradeta=0)

    'vaztarastis'→ Važtaraščiai

    'klientai' → Klientai

    'zaliavos' → Žaliavų sandėlis

    'receptai' → Receptūros

    'kpi' → KPI Ataskaitos (pakeitė seną žurnalo tab)

    'istorija' → Istorija (baigtos kortelės)

    `

    Gamybos lango sub-tabs (_gamybaLangasTab)

    `

    'maisomi' ← DEFAULT — kortelės su sumaisytas_kiekis > 0

    'paketeliai' — plevele tipo

    'pauchai' — pakuočių sandėlio vaizdas

    'stickai' — stick tipo

    `

    > ⚠️ 'gavimai' NUO 2026-07-08 NEBĖRA Gamybos lango sub-tabas — perkeltas į Gaminama

    > (pagrindinį) langą kaip _pagrindinisTab === 'gavimai'renderGaminamaGavimaiLentele()

    > (gamybos būklės dashboard'as su virtualiomis eilutėmis, žr. 2026-07-07/08 sekciją viršuje).

    Svarbūs state kintamieji

    `javascript

    let _gamybaLangasTab = 'maisomi'; // default tab

    let _pakuociuSandelisData = null; // null = reload, {} = cache

    let _gamybaCardId = null; // aktyvi kortelė

    let allZurnalasLogs = []; // žurnalo cache

    let activeSidebarTab = 'gaminama'; // aktyvus pagrindinis tab

    `

    ---

    7. ŽINOMOS SUBTILYBĖS / SPĄSTAI

    > [!danger] Kritinės klaidos

    > - receptai lentelė NETURI kodas kolonos

    > - DB failas: C:\VM\pb_data\data.db (NE vm-darbas.db — senas pavadinimas)

    > - Naudoti node:sqlite ES module (NE better-sqlite3)

    > - NIEKADA TailwindCSS — tik vanilla CSS

    Žinomos klaidos ir sprendimai

    KlaidaSprendimas |
    |--------|-----------|
    r.kodas column not foundreceptai neturi kodas kolonos — pašalinti iš SQL |
    Pouchai kaip tuščios kortelėsNeteisingas workflow. Naudoti pakuociu_sandelis |
    Archyvavimo filtras statusas != 'archyvuota'KLAIDINGA — archyvavimas žymimas archyvuota DATOS stulpelyje, statusas lieka 'baigta'. Filtruoti (archyvuota IS NULL OR archyvuota='') |
    API laukai lietuviškaiingredientai (ne ingredients), statusas (ne busena — PB reliktas), norma_porcijai, kiekis_vienai_porcijai — prieš naudojant lauką PATIKRINTI realų API atsakymą |
    „STAKLĖS ✓" žurnalo įrašasKUMULIACINĖ užbaigimo žymė (visas pagaminta_kiekis), NE nauja produkcija — nesumuoti į KPI |
    POUCH dublikataiIdentiški POUCH registravimai skirtingom dienom = tikėtinas dubliavimas (2026-07-10 Creatine atvejis) — tikrinti prieš pasitikint |
    PALAIDI eilutėms recepto pakavimo laukai (dez_dezeje ir pan.)Netaikomi/klaidinantys, jei tiesiog kopijuojami iš recepto — palaidi neturi tarpinių pakavimo sluoksnių. Prieš rodant/saugant PALAIDI kontekste, aiškiai NULL'inti arba ignoruoti tokius laukus |
    Batch string su dubliuota data be LOTKai kurie seni įrašai (batch stulpelis) turi du datos formato fragmentus be tikro LOT (pvz. „EXP:x \| x") — LOT/EXP parseris turi eksplicitiškai atmesti VISAS datai/EXP panašias dalis prieš priskirdamas likusią LOT, ne tik „pirmą rastą" |
    Prieš rašant naują UI logiką tikrinti EARLY-RETURN validacijasBendros funkcijos (pvz. vzAddItemToPallet) dažnai turi anksčiau parašytą guard'ą viršuje (if (!x) return), kuris tyliai blokuoja naują šaką apačioje — pridedant naują tipą/atvejį, PATIKRINTI ar viršutinės validacijos jo neatmeta |

    ---

    8. PASKUTINIAI PAKEITIMAI

    2026-08-11 — sesija (3): OmniRoute valdymas agentui

  • OmniRoute valdymo prieiga agentui SUKONFIGŪRUOTA — API raktui sk-91161731e4e0d947-178100-78f44d6b (CLI Auto-Key, id 67af762b-72a3-4ca8-ad05-0fe6af0ea185) suteiktas manage+admin scope tiesiogiai ~/.omniroute/storage.sqlite (backup: storage.sqlite.backup-20260811-234750). Patikrinta gyvai: GET/PATCH /api/settings, GET /api/tunnels/tailscale/check, GET /api/models — visi 200 su Bearer. Agentas dabar gali programiškai keisti visus OmniRoute nustatymus: omniroute --base-url http://localhost:20128 api settings ..., tunelius (/api/tunnels/*), providerius, rate limit, IP filtrą, requireLogin, modelių routingą.
  • Analizė sukurta: C:\Users\justa\OMNIROUTE-TAILSCALE-CODEX-ANALIZE.md — Tailscale integracija, agento nustatymų CRUD, Codex nemokamai (pilna diagnozė).
  • ⚠️ Kritiniai radiniai (kodui/ateities sesijoms):
  • - Tailscale Funnel JAU aktyvushttps://justas.tailf67d20.ts.net/127.0.0.1:3000 (VM serveris). OmniRoute savo Funnel įjungimas perrašytų šį maršrutą (vienas root maršrutas). Vartotojo sprendimas užfiksuotas atmintyje: VM puslapis turi likti, OmniRoute tik PRIDĖTI (ne perrašyti) — žr. [[feedback_tailscale_funnel_neraoverwrite]].

    - oc/* modeliai routeriuje → "codex" provider, kuriam prisijungimo NĖRA (codex OAuth neegzistuoja — 404). opencode/* → "opencode" provider, bet jo raktas sugedęs (upstream "Missing API key", nors statusas "active"). Codex CLI fix reikalauja vartotojo veiksmo: perdaryti opencode API raktą Dashboard → Providers → "OpenCode Account 1".

    - Nemokami modeliai VEIKIA per API (auto/coding:free, oc/longcat-2.0-free, oc/deepseek-v4-flash-free, opencode/deepseek-v4-flash-free) — Codex CLI kaip klientas NEveikia (žr. aukščiau).

    - Kiti tuneliai (neperrašo VM Funnel): cloudflared quick tunnel (POST /api/tunnels/cloudflared, be paskyros/rakto) ir ngrok (POST /api/tunnels/ngrok, reikia NGROK_AUTHTOKEN). Abu atskiri nuo Tailscale. Vartotojo sprendimas atidėtas rytoj; prieš viešą adresą patikrinti requireLogin. Detaliau — atmintyje [[project_omniroute_valdymo_setup]].

    2026-08-11 — sesija (viršvalandžių komentaras + wmux/Orca skills + taisyklių analizė)

  • darbo_laikas DB — nauja komentaras kolona (server.js migracija su guarded ALTER TABLE): POST/PUT priima laisvą komentarą prie dienos, GET grąžina per SELECT *. Desktop „Viršvalandžiai" ir Mobile „Darbo laikas" istorijoje paspaudus dieną su komentaru — komentaro popup (vvShowComment/hrShowComment, fiksuotas overlay su mousedown+click guard). Desktop forma: „Komentaras (nebūtina)" laukas (vvFormKom). Telegram boto INSERTai (be komentaro) veikia per DEFAULT ''. Detaliau — §3 schema + §6 UI.
  • Telegram boto įrašto komentaras atkurtas — vartotojo praleistas komentaras (registruota prieš serverio fix) įrašytas tiesiai į DB per UPDATE.
  • 2026-08-11 — sesija (2): New skills

  • Sukurti 4 *.claude/skills/ skill'ai (kaip Orca CLI): wmux (daugiaagentė orkestracija per MCP, Orca vs wmux atskyrimas, „kur vyksta tavo sesija" — išorinė sesija = tik stebėjimas → patikrinta gyvai), orca-cli (darbinis terminalas), orchestration (a2a gyvavimo ciklas, misijos, fanout, deck), wmux-browser (naršyklės automatizavimas). Skill'ai auto-atsidaro pagal description frazes.
  • Gyvas wmux MCP patikrinimas: iš išorinės (ne-wmux-terminalo) sesijos veikia TIK workspace_list/a2a_discover/pane_list/surface_list; visi identity-scoped įrankiai (channel_*, a2a_task_*, wmux_events_poll, wmux_search_panes, browser_*, terminal_read su ptyId) grąžina *Workspace identity unknown* / *BROWSER_TABS_WORKSPACE_UNRESOLVED*. Reikia bėgti wmux terminalo workspace'e.
  • 2026-07-08 — sesija (commit'ai b3b6e16, 5d7095e, ac405a1, f0c8a42)

  • Gavimai → Gaminama (index.html): gavimų lentelė perkelta iš Gamybos lango į Gaminama kaip pilnavertis tabas — gamybos būklės dashboard'as (Agy užduotis #25 + Claude pertvarkymas). Virtualios eilutės (_pradetiIsVirtualaus), redagavimas tiesiai lentelėje, „Pradėti gamybą" mygtukas, naujausias gavimas viršuje.
  • Rezervacijos įrankis (Gaminama skydelis): kelių produktų bendras žaliavų poreikis vs sandėlis, kg—vnt. formatas, PDF gulsčias/stačias.
  • Maišymo kortelės spausdinimas: „Viso užsakymui" stulpelis, kompaktiškas maišymų tinklelis, LOT/EXP žaliavų lentelėje.
  • Mobile Priėmimas: vieninga produktų paieška, pouch veiksmo mapping fix, dropdown skaidrumo fix (--bg-sheet).
  • ✅ Suvienodintas „Nauja kortelė" modalas tarp Gamyba ir Gaminama langų.
  • „Premix pasiruošimas" spausdinimo lapas (index.html, vakarinė sesija): _premixSmulkus(ings, svorisGr) atrenka smulkius ingredientus (< 0.25 g/pktl ARBA < 2% pakuotės svorio, min 2 vnt.), printPremixLapas() spausdina atskirą violetinį lapą — kiekiai visam užsakymui, LOT/EXP, MIX norma g/pktl ir prisvėrimo pavyzdžiai maišymams. Mygtukas kortelės modale šalia „Spausdinti gamybos užduotį", rodomas tik kai receptas turi smulkių. Jokių DB pakeitimų — viskas dinamiška (vartotojo sprendimas: premix maišomas visam užsakymui iš karto, be atskiros žaliavos/LOT sekimo). Kilmė: Agy #26 TITAN analizė (titan-premix-analize.md) — senoje sistemoje buvo 2 receptai, premix MIX (OF) 0.32037 g/pktl = 9 smulkiųjų suma.
  • Premix kiekis pagal gautas dėžutes: _printKorteleData papildytas dezGauta (žurnalo veiksmai Gauta dėžutės/Dėžutės gautos/Priimta dėžutė, match pagal batch-LOT arba pavadinimą). Premix lape kiekis — redaguojamas #pmQty input su gyvu perskaičiavimu (pmRecalc(), data-norma atributai) ir „Pagal gautas dėžutes: N dėž. × pak_dezuteje ⟵ naudoti" mygtuku. Jei plano nėra — startuoja nuo dėžučių kiekio. Use case: TITAN dėžutės gautos (7 550 dėž. × 30 = 226 500 pktl), plėvelė dar ne.
  • 2026-07-07 — sesija (commit'ai 4d647c2, 0404cbe, 35b1443)

  • BACK TO LIFE multi-regionų kortelė LT/LV/palaidi: regiono SUDĖTA „dėžės.dėžutės" formatu; fix — SUDĖTA žurnalo trynimas/keitimas perskaičiuoja kiekvieno regiono supakuota_kiekis (anksčiau „įstrigdavo"). Sukurtos/atkurtos kortelės: SELENE (BF), HYDRO FORTE LV/EST (BF).
  • Važtaraštis: juodraščio autosave (localStorage, su atkūrimo pasiūlymu; fix — vzClientChanged() nebeištrina atkurtų palečių), „Dėžučių/dėž." stulpelis, spausdinimo lūžio fix (display:table), regiono pasirinkimas prekės pridėjime, palaidi varnelė BF klientams.
  • Etikečių spausdinimas: „Palaidi" varnelė laisvame generatoriuje + „PALAIDI" žyma.
  • ✅ „▶ Pradėti gamybą" mygtukas maišymo lange ir pouch sandėlio sąraše (vietoj duomenis dubliavusio „Baigti gamybą").
  • ✅ Agy #24: LIKE 'STAKL%' → tikslus veiksmas = 'STAKLĖS' atitikimas 3 žurnalo endpoint'uose (dvigubo pagaminta_kiekis skaičiavimo fix). Agy #22/#23: mobile važtaraščio vaztNepilnaUsesDezSub() helperis + CSS calc(-1 * var()) fix.
  • 2026-07-03 — sesija

  • Mobile etiketės — NUTRIOTECA (SL) šablonas (public/mobile.html) — mobilioji app etikečių ekranas visada naudojo bendrą /api/gamybos-korteles/:id/etiketes-html (24 lipdukai/lape, generinis dizainas), net ir SL klientui, kuriam turi būti spausdinamas kitoks, kliento pateiktas NUTRIOTECA šablonas. Svarbu (dvi skirtingos endpoint'os, nesupainioti): /api/dezes-lipdukas?kortele_id= generuoja 1 lipduką/lape — tai atskiras „🏷️ Dėžės lipdukas" mygtukas transportinės dėžės išorei (desktop index.html). /api/etiketes-laisvos?receptas_id=&lot=&exp=&serija=&lapai= su NUTRIOTECA_LABEL_MAP recepto ID generuoja 14 lipdukų/lape (pagal lapai param) — tai teisingas endpoint'as įprastam „daug etikečių ant lapo" spausdinimui (naudoja desktop'o „Etiketės laisvos" modalas). Pataisyta: naujas _etiketesUrl(id, lapai) helperis, kuris SL kortelėms nukreipia į /api/etiketes-laisvos (su card.kliento_lot||card.lot, card.exp, card.receptas_id), o ne į /api/dezes-lipdukas. „Lapų skaičius" antraštė dinamiškai rodo 14 vs 24 pagal klientą.
  • Mobile etiketės — užsakovo filtras (public/mobile.html) — pridėtas „Užsakovas" pasirinkimo laukas (dropdown iš unikalių kliento_kodas reikšmių tarp visų kortelių) prieš produkto paieškos lauką; pasirinkus užsakovą, paieškos sąrašas filtruojamas tik pagal jo korteles. Sąrašo įrašuose taip pat pridėta kliento spalvota žymė (renderClientBadge).
  • Patikrinta realiu Playwright headless naršyklės paleidimu prieš veikiantį serverį + tiesioginiu curl į /api/etiketes-laisvos — patvirtinta 28 lipdukai (14×2 lapai) su teisingu produkto pavadinimu ir kliento LOT; ne-SL kortelėms senas /etiketes-html + 24/lape srautas nepakitęs.
  • wmux MCP įrankis įdiegtas (sisteminis, ne repo dalis) — Windows terminalo multiplekseris agentų tarpusavio bendravimui (a2a_send/a2a_broadcast) tarp Claude Code ir kito CLI agento (Agy/Antigravity CLI), be vartotojo rankinio perdavimo. Konfigūracijos backup prieš diegimą: ~/.claude/backups/pre-wmux-20260703-081807/. a2a_discover pasirodė nepatikimas (mato tik save) — žr. [[feedback_wmux_pane_targeting]] atmintyje, naudoti pane_list/surface_list + terminal_send su konkrečiu ptyId.
  • AGENTS.md — „Gyvas kanalas" — per wmux sukurta antra Claude Code sesija (kartu su Agy) šalia šios, jai priskirta ir užbaigta Užduotis #13/#14 (BF receptų pakavimo konfliktų sprendimas realiais PDF/Excel šaltiniais). Rezultatas: visi 22/22 BF produktai importuoti į DB (SELENE, Laxmag papildyti vartotojo pateiktais duomenimis). Detali eiga → agy-uzduotis.md #14, likę atviri klausimai (LABASEN/SPORT PROTEIN NR.2 dublikatai, COR4 be sudėties, BIOKALCIS svorio neatitikimas) → [[project_bf_receptu_spragos]] atmintyje (bendra abiem sesijoms).
  • Commit f61f0ac: mobile etikečių fix + AGENTS.md/agy-uzduotis.md/bf-receptai-draft.md pakeitimai.
  • Projekto analizė + kritinių klaidų taisymas (server.js, telegram-bot.js, public/mobile.html) — pilna analizė (Claude fork + Agy #15) rado bugus abiejuose backend failuose. Pataisyta:
  • - telegram-bot.js: pridėtas escHtml() — Telegram parse_mode:'HTML' pranešimai anksčiau lūždavo su &/</> simboliais vartotojo varde/produkto pavadinime (400 klaida, pranešimas neišsiunčiamas).

    - telegram-bot.js (apdorotiMaisyma): trūkstama recepto norma (baseNorma/ing.norma = null/undefined) galėjo įrašyti NaN į zaliavos.likutis — pridėta !(x > 0) patikra (pagauna NaN/null/undefined, ne tik <=0).

    - telegram-bot.js: hrDel_, archyvavimo (confirmF_) ir žurnalo trynimo (dL_) catch blokai anksčiau arba tylėjo apie klaidą, arba apeidavo server.js verslo logiką tiesioginiu DB rašymu — dabar visur tiesiog praneša klaidą vartotojui.

    - telegram-bot.js: 3 vietose (zGaliojimas|, pGaliojimas|, dGaliojimas|) EXP data priimama be validacijos — pridėta isValidDateStr() (YYYY-MM-DD regex + Date patikra).

    - server.js (registruoti-pagaminta): KRITINĖcatch fallback aklai kartodavo pagaminta_kiekis += kiekis, nors faktinis_sunaudojimas.js registruotiPagaminta() (be transakcijos, WAL) galėjo jau būti atlikusi tą pačią operaciją prieš klaidą → galimas dvigubas kiekio užskaitymas. Fallback pašalintas, dabar tiesiog 500 su klaidos tekstu.

    - server.js (toggle-pill): pridėta isNaN patikra prieš rašant boolean-tipo stulpelį.

    - public/mobile.html: offlineQueue.processQueue() po sėkmingos sinchronizacijos visada kviesdavo render(), ištrindama darbuotojo pildomą Priėmimo formą (#mBulkRows gyvena tik DOM'e) — dabar render() praleidžiamas, jei state.screen === 'receiving'.

    - Atidėta (architektūrinis sprendimas, ne bugfix): UTC vs Europe/Vilnius laiko zona (new Date().toISOString() naudojama visur sistemoje vienodai — pataisius tik vieną lauką atsirastų nenuoseklumas).

  • Važtaraščio „papildomi adresai" (alternatyvus gavėjas) — pridėtas UI abiejose versijose (desktop public/index.html: vz-address-wrap/vzGetRecipient(); mobile public/mobile.html: vaztAddress/vaztGetRecipient()), leidžiantis pasirinkti kliento papildomi sąrašo adresą vietoj pagrindinio važtaraščio kūrimo metu.
  • 🔴 SVARBUS RADINYS: PocketBase schema "nutyli" nežinomus SQLite stulpelius. klientai.papildomi stulpelis realiai egzistuoja SQLite lentelėje (pridėtas anksčiau tiesiogiai, ne per PB migraciją), bet pb.collection('klientai').getFullList() jo VISAI negrąžina JSON atsakyme — PocketBase serializuoja tik laukus, kuriuos pats žino iš savo schema meta. Bet koks endpoint'as, naudojantis pb.collection() (ne tiesioginį db.prepare()), NEGAUS papildomi reikšmės, net jei ji SQLite yra. Pataisyta GET /api/vaztarastis-duomenys (server.js) — po pb.collection('klientai').getFullList() papildomai užklausiama db.prepare('SELECT id, papildomi FROM klientai') ir sujungiama pagal id. Jei ateityje kitas endpoint'as irgi naudoja papildomi (ar bet kurį stulpelį, pridėtą praeityje tiesiogiai per SQLite, ne PB Admin UI/migraciją) per pb.collection() — jam reikės to paties merge patch'o.
  • ⚠️ klientai.papildomi laukas naudojamas DVIEM SKIRTINGAIS TIKSLAIS — dauguma klientų jį naudoja kaip masyvą papildomų pristatymo adresų [{pavadinimas, adresas}] (pvz. SOULEL/„SL"), bet bent vienas klientas („SM"/SANTAMED LT) jį naudoja kaip objektą su {imones_kodas, pvm} (įmonės rekvizitai). Kodas, skaitantis papildomi kaip adresų masyvą, turi apsisaugoti nuo šio atvejo (JSON.parse(...) gali grąžinti objektą, ne masyvą — Array.isArray() patikra prieš .map()).
  • SOULEL (kodas „SL") kliento pavadinimas/adresas pakeisti į „Logistus 3PL" / „Ugniagesių g. 14, LT-02244, Vilnius, Lietuva" — vartotojo prašymu, jo važtaraščiai turi rodyti 3PL sandėlį kaip gavėją, ne patį SOULEL. kodas='SL' NEPAKEISTAS (receptai/kortelės sieja per kodą, ne pavadinimą) — pakito tik display laukai.
  • 2026-07-02 — sesija (didelė, maratoninė)

  • Dosje/archyvavimo logikos suvienodinimas (server.js) — buvo 4 lygiagrečios, istoriškai išsiskyrusios dosje/kortelės generavimo implementacijos. Ištrinta perteklinė/buginga GET /api/dosje/:id (ir client-side window._printDosje, ~68 eil.) — liko archyvuoti (stored dosje_tekstas), /dosje-html (visada gyvai perskaičiuojamas HTML), ir printGamybosKortele()/_printFaktineKortele() (maišymo kortelės spausdinimas).
  • pakuociu_nurasymai lentelė (nauja, žr. §3) — pouch pakuočių PASTOVUS nurašymas archyvuojant, kad pakuociu_sandelis "laisva" liktų teisinga po archyvavimo (anksčiau dingdavo iš rezervacijos skaičiavimo).
  • archyvuoti endpoint fix'ai — idempotencijos apsauga (jei jau archyvuota → klaida), nurasymai SQL trūko zaliava_id (sukeldavo "cannot be bound to SQLite parameter 1" klaidą), važtaraščių paletės/dėžės skaičiavimas filtruojamas pagal PRODUKTĄ (buvo klaidingai imami visos siuntos totalai — dosje rodydavo kitos produkcijos pal./dėž. skaičius), žaliavos grupuojamos pagal pavadinimą, kliento kodo fallback (kliento_kodasreceptas.klientas kai 'KITA'/tuščia).
  • faktiniai_duomenys TEXT — perkeltas iš retai trigerinamo sync kelio į besąlyginę startup migraciją (anksčiau archyvavimas visada lūždavo "no such column").
  • baigti-stakles — pouch tipo produktams dabar VIENOJE UPDATE kartu nustato ir stakles_baigtos=1, ir pakavimas_baigtas=1 (pildymas+pakavimas vyksta vienu metu pouchams) — bet koks UI kelias (senas/naujas) dabar nuoseklus.
  • /api/istorija — grąžindavo be sumaisytas_kiekis/pakuotes_tipas/faktiniai_duomenys laukų → "Gamybos kortelė" iš Istorijos rodydavo 0/tuščia. Papildyta.
  • Gamybos lango kortelės quick-menu (index.html) — paspaudus produkto pavadinimą, mažas popup: Maišymai / Etiketės / Baigimo darbai / Kortelė info (vietoj tiesioginio modalo). ~470 eil. pašalinta negyvo kodo (openMaisymasModal, submitMaisymas, vzPrintHistory, _openZaliavosIstorijaModal).
  • "Gamybos kortelė" spausdinimas perrašytas — pašalintas prieš-spausdinimo bazės/kg dialogas (dabar spausdina iš karto), pašalintas dvigubas "pilni maišymai vs. paskutinis maišymas" stulpelis (dabar vienas: norma_porcijai × sumaisytas_kiekis, BE nuostolių%). Pervadinta "Spausdinti kortelę" → "Spausdinti gamybos užduotį".
  • PDF atsisiuntimas — nauji helperiai _downloadHtmlAsPdf() / _downloadDosjePdf() (naudoja esamą /api/generuoti-pdf), "📥 PDF" mygtukai prie visų "🖨 Dosje" vietų + spausdinimo languose.
  • BF receptai — 24 iš viso (buvo 6): užpildyta HYDRO FORTE 1/2 ir POWER C 1000 sudėtis (anksčiau tušti arba klaidingai recepto_sudetis lentelėje su dubliuotomis žaliavomis); importuota 18 naujų receptų iš senos xlsx (bf-receptai-draft.md). HYDRO FORTE LT/LV-EST liko be savo ingredientai — tai teisinga: jos yra combo-dezute tipo pakavimo įrašai, sudaryti iš HF1+HF2 (žr. pastabos lauką recepte). Neišspręsta: LABASEN 1 GR / SPORT PROTEIN NR.2 (identiški LABANAKT/SPORT PROTEIN — dublikatai?), COR4/SELENE/Laxmag (nėra sudėties senoje sistemoje), BIOKALCIS 1200 (katalogo svoris≠sudėties suma) — žr. [memory: project_bf_receptu_spragos.md].
  • .claude/hooks/block-dangerous.sh (lokalus, negit'inamas) — pridėta S:\ prieigos blokada bet kokiai Bash/PowerShell komandai (mechaniškai vykdo CLAUDE.md taisyklę, ne tik tekstu). git commit išimtis praplėsta tikrinti bet kur komandoje (ne tik pradžioje), kad neblokuotų git add && git commit -m "..." grandinių, kur žinutėje paminėtas "S:\".
  • CLAUDE.md — sesijos pabaigos rutina papildyta žingsniu peržiūrėti sesijos klaidas/korekcijas ir jas fiksuoti kaip feedback_*.md atmintį (self-improving-agent formatas), neatidėliojant.
  • 2026-07-01 — sesija

  • Važtaraštis — spausdinimo šablonų suvienodinimas (index.html) — vzSilentPrint() naudojo seną, neteisingą šabloną (kitas įmonės pavadinimas/adresas). Ištraukta bendra vzBuildVaztarastisHtml() funkcija — dabar „Peržiūra"/PDF/„Spausdinti" visi naudoja tą patį, teisingą GAS stiliaus maketą.
  • Važtaraštis — dvigubo dėžių skaičiavimo klaida (index.html) — nepilnos dėžės +1 buvo pridedama du kartus (prie it.dez/it.space, kurie jau įskaičiuoja nepilną, ir dar kartą suvestinėje) → 8 pilnos + 1 nepilna rodė 10 vietoj 9. Ištaisyta bendroje suvestinėje, paletės antraštėje ir produktų suvestinėje.
  • Važtaraštis — lentelė supaprastinta (index.html + server.js) — pašalintas nereikalingas „DĖŽUČIŲ/DĖŽ." stulpelis, „PKTL./DĖŽ." pervadintas į „PAK./DĖŽ." (abu šablonai: peržiūra/spausdinimas ir istorijos PDF).
  • Važtaraštis — „Nepilna dėžė" laukelio regresija (index.html) — pouch produktams (dez_dezeje=1 yra tik apeinamasis žymėjimas „nėra tikro sub-lygio", ne reali struktūra) laukelis klaidingai interpretavo įvestą kiekį kaip dėžučių, ne vnt., ir dauginant iš pak_dezuteje gaudavo klaidingą (10–50×) kiekį. Sąlyga pataisyta į dez_dezeje > 1 — realus dėžučių sub-lygis egzistuoja tik HYDRO FORTE tipo produktams.
  • Maišymo kortelės modalas — persidengimas (index.html) — „Paketeliai" grupė neturėjo flex-shrink:0, siaurame lange etiketė persidengdavo su input laukeliu. Pridėta abiem („Nuostoliai", „Paketeliai") grupėms.
  • „Maišomi" kortelė (index.html) — pridėtas užsakovo pavadinimas (ne tik kodas) prie kiekvienos kortelės; ištaisyta rašybos klaida „Maisomi" → „Maišomi" tab'o etiketėje.
  • Etiketės — „7g" pašalinta (server.js) — svoris nebebuvo reikalingas etikečių info eilutėje (/api/etiketes-laisvos ir kortelės /etiketes-html), trukdė sutilpti likusiai informacijai.
  • NUTRIOTECA (SL) transportinės dėžės etiketė (server.js) — nauja funkcija pagal kliento pateiktą .docx šabloną 5 produktams (Daily Creatine, Bone Broth + Creatin, Electrolytes + Creatine/Vitamin C/Red Berries): prekės ženklo pavadinimas, N packs (net Xg), Brutto, Best before, kliento LOT (atskiras nuo mūsų vidinio), Units per box, EAN-13 barkodas (grynas JS, be išorinių bibliotekų — renderEAN13Svg()), UAB Aeterna Cibus rekvizitai. Integruota į /api/etiketes-laisvos (12→14 lipdukų/lape, sutankinta) ir atskirą /api/dezes-lipdukas?kortele_id=. Naujas DB laukas gamybos_korteles.kliento_lot. „🏷 Etiketės" mygtukas šiems produktams automatiškai atidaro šį šabloną.
  • Brutto svorio skaičiavimas (server.js) — nauji receptai laukai pak_svoris_g (paketėlio plėvelė), dezute_svoris_g (dėžutė), deze_svoris_g (transportinė dėžė). Brutto = (svoris_g+pak_svoris_g)×Units_per_box + dezute_svoris_g×dez_dezeje + deze_svoris_g. Užpildyta 3/5 SL produktams (Vitamin C, Red Berries, Daily Creatine); likusiems 2 (Bone Broth, Electrolytes+Creatine) laukia realių pakuotės svorių — lieka tuščia eilutė kaip originaliame šablone.
  • DRIVE katalogo valymas (server.js) — naktinis cron (3:00) dabar taip pat valo pamirštus _tmp_*.html failus DRIVE/ kataloge (PDF failai/istorija neliečiami).
  • SQLite MCP serveris — sukonfigūruotas .mcp.json (mcp-server-sqlite-npx, nukreiptas į pb_data/data.db) tiesioginėms SQL užklausoms be node -e scenarijų.
  • Agy CLI paleidimo pataisymasVM Agentai.lnk „Agy" tab'as klaidingai paleisdavo agy.cmd (senas apsimestinis wrapper'is su Claude Code + custom prompt), nors tikras Antigravity CLI (agy.exe, jau PATH) seniai įdiegtas. Pataisyta nuoroda, ištrintas pasenęs agy.cmd + .claude/agy-prompt.md.
  • 2026-06-30 — sesija

  • Maišymo kortelė — paketelių skaičius (index.html + server.js) — naujas "Paketeliai" laukelis modalo parametrų juostoje: įvedi N vnt → ingredientai perskaičiuojami pagal N × norma × (1+nuostoliai%). Spausdinimas: pktCount query param, antraštė rodo "N pkt" vietoje "1 maišymui". Prioritetas: bazė > paketeliai > planas.
  • Mobile etiketės — visos kortelės (mobile.html) — anksčiau rodė tik aktyvias (gamyba_pradeta=1). Dabar lazy-load visų ne-archyvuotų iš /api/gamybos-korteles kai atidaromas ekranas. Ženkliukai [Plan.] / [Baigta] / [Aktyvi].
  • Mobile etiketės — paieška (mobile.html) — dropdown pakeistas teksto lauku su live filtru pagal pavadinimą arba LOT. Sąrašas rodomas žemiau, paspaudus pasirenka ir užsidaro. ✕ mygtukas valo pasirinkimą.
  • etiketesPrint fix (mobile.html) — safeFetch() grąžina JSON, bet /etiketes-html grąžina HTML → pakeista į fetch() + .text().
  • 2026-06-23 — sesija (pilna diena)

  • Važtaraščio spausdinimas — LOT/EXP atskirose eilutėse, PAK./DĖŽ. headeris, pouch nepilna dėžė, LOT: prefiksas
  • Važtaraštis "Viską" mygtukas — desktop + mobile, automatiškai prideda visą sandėlio likutį su teisingomis dėžėmis
  • Važtaraštis "Spausdinti" — desktop tylus spausdinimas per /api/mobile/print (kaip mobile)
  • Gamybos kortelė bazės pasirinkimas — dialogas prieš spausdinant, maišymų skaičiavimas pagal bazę
  • Faktiniai duomenys — archyvuojant išsaugomas JSON (faktiniai_duomenys kolona), iš istorijos spausdina faktinę kortelę
  • Partijų rodymas — getIngBatch pataisytas (includes match), serveris be busena filtro
  • Pouch likučio fix — vaztarastis-duomenys ir nurašymas naudoja pagaminta kai supakuota=0
  • Pouch mobile — kortelės detail rodo dėžes+nepilną, "Pripildyta" label, teisingas sandėlio likutis
  • Telegram pranešimai iš web — notifyTelegram() po maišymo, staklių, pakavimo, išvežimo
  • GAS LOT/EXP importas — 8 DS žaliavų atnaujinta iš Excel
  • Playwright PDF fallback — lokali ms-playwright chromium
  • BF klientas — Back to Life receptas
  • Maišymo kortelė — B&W spausdinimui, orientacijos pasirinkimas, supaprastinta
  • Maišymo kortelė — supaprastinta juodai-balta (spausdinimui), orientacijos pasirinkimas (landscape/portrait), pašalinta maišymų istorija ir progresas, žaliavų lentelė tik „1 maišymui" stulpelis su dot-leader
  • Gamybos kortelė iš istorijos_printGamybosKorteleFromIstorija() leidžia spausdinti archyvuotų kortelių maišymo korteles
  • Maišymo modalas → „Maišymo kortelė" (peržiūra vietoj registravimo, pašalintas greitas registravimas)
  • Dosje archyvavimas — žaliavų grupavimas pagal pavadinimą, išvežimų papildymas iš gamybos_zurnalas kai PocketBase neturi senų
  • /api/vaztarastis-duomenys — perrašytas iš PocketBase į tiesioginį SQLite (greitesnis)
  • Naujas klientas BF — Back to Life receptas
  • fmtMg pataisymas — rodo g/mg teisingai, gr/pktl headeris kortelėje
  • Sufasuota rodiklis — gamybos kortelės spausdinime rodo faktinį pagaminta_kiekis
  • 2026-06-22 — sesija (pilna diena)

  • Naujas klientas UAB SOULEL (SL) — 5 stick receptai, 10 žaliavų (SL), 5 gamybos kortelės
  • Etikečių spausdinimasGET /api/gamybos-korteles/:id/etiketes-html, mobile ekranas, skirtingi šablonai paketeliai/pouch, EXP apačioje
  • Bendras maišymas — paskirstymas kelioms kortelėms vienu metu (desktop modal)
  • node-cron — DB backup kas 6h, temp failų valymas 3:00, health log kas 1h
  • Gamybos langas — "Registruoti" mygtukai plėvelei/dėžutėms (quick modal)
  • Mobile pouch registravimas — dėžių + nepilnos dėžės įvedimas
  • Važtaraštis — nepilna dėžė +1 dėžių sumoje, LOT/EXP atskirose eilutėse, PAK./DĖŽ., dez_dezeje fix
  • PDF auto-saveC:\VM\DRIVE\ po nurašymo, Google Drive katalogas paruoštas
  • AGENTS.md — kokybės kontrolės skilai, Agy checklist, security hook
  • Custom commands — /commit, /update-wolf, /check-server, /interview, /spec, /doubt
  • jq 1.7.1 — portable CLI JSON parser tools/jq.exe
  • Claude HUD plugin — context/rate limit statusline
  • Olvel Magnesium — svoris 6.5g, planas ×2 (dvigubas formatas), mišinys užregistruotas
  • 2026-06-17 — sesija 1 (rytas)

  • pakuociu_sandelis lentelė sukurta
  • /api/pakuociu-sandelis GET/POST/DELETE
  • ✅ Pauchai tab → sandėlio vaizdas
  • ✅ Maisomi tab — naujas DEFAULT tab Gamybos lange
  • ✅ Pagrindinis langas — ⚗ badge clickable pouchams
  • ✅ DN92197 gavimas užregistruotas (5 produktai, Alpi Eesti)
  • 2026-06-17 — sesija 2 (vakaras)

  • OpenWolf sistema sukurta — .wolf/ direktorija su 8 failais
  • /wolf route — projekto žemėlapis naršyklėje (tekstas su tabs)
  • /wolf/graph route — interaktyvus D3.js tinklo grafas (8 mazgai, 22 ryšiai)
  • Viršvalandžių ekrane🕸 Grafas + 🐺 Tekstas mygtukai
  • self-improving-agent hook aktyvuotas (.claude/settings.json)
  • Obsidian instaliuotas (C:\Users\justa\AppData\Local\Programs\obsidian\)
  • Desktop shortcut sukurtas (VM Wolf.lnk) — atidaroma su vault'u
  • readdirSync pridėtas prie server.js importų
  • CLAUDE.md atnaujintas — sesijos pabaigos rutina + teisingas DB pavadinimas
  • agy-uzduotis.md atnaujintas — sesijos pradžios rutina Agy agentui
  • Obsidian vault failai: HOME, db-schema, workflow, pakuotes, klaidos
  • 2026-06-17 — sesija 3 (vėlyvas vakaras)

  • Antigravity Awesome Skills įdiegti ir aktyvuoti: nodejs-backend-patterns, nodejs-best-practices, sql-optimization-patterns.
  • POST /api/gavimai/bulk endpoint'as sukurtas plėvelių rulonų priėmimui su auto-generuojamu LOT kodu [Raidė][YYMMDD].
  • Desktop UI pajamavimo modalo išplėtimas — sukurtas „Multi-plėvelės” tab'as su dinamišku eilučių pridėjimu/pašalinimu bei LOT peržiūra.
  • Mobile UI pajamavimo modalo išplėtimas — sukurtas „Bulk Plėv.” tipas su supaprastinta multi-entry forma rulonų registravimui.
  • Dokumentacija — atnaujinta API schema [cerebrum.md](file:///C:/VM/.wolf/cerebrum.md) ir [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md) užduočių registras.
  • 2026-06-18 — sesija 7 (Agy)

  • Gamybos Dosjė patobulinimai (server.js): atnaujintas dosje_tekstas generavimas archyvavimo metu, pridedant išsamų žaliavų LOT/EXP atsekamumą su nurašymų ir gavimų lentelių palyginimu, maišymų suvestinę iš gamybos žurnalo, kliento informaciją su kliento serija etiketėms ir bendro sumaišyto kiekio rodymą.
  • A4 portrait spausdinimo endpoint'as (GET /api/gamybos-korteles/:id/dosje-html): sukurtas naujas endpoint'as, kuris grąžina profesionalų, A4 portrait formatui ir spausdinimui pritaikytą HTML su Daily Spoon logotipu, suvestinėmis ir parašo laukais.
  • UI patobulinimai (public/index.html): pridėti „🖨 Dosje“ mygtukai istorijos kortelės valdyme bei modaliniame lange, atidarantys naująjį spausdinimo puslapį naujame lange.
  • 2026-06-18 — sesija 6 (Agy)

  • Portuotas pilnas Telegram botas (telegram-bot.js) – 100% atstatytas visų funkcijų veikimas (monitorius, maišymai, trūkstamų žaliavų planavimas, UUID-saugus žurnalo ir HR įrašų redagavimas/trynimas, priėmimas, naujų narių admin patvirtinimai).
  • Sintaksės klaidų ištaisymas – pašalinta dubliuota userStates deklaracija ir suderinta SQLite su Express /api/priimti-medziagas API.
  • Dokumentacijos atnaujinimas – Wolf vault schema, workflow ir pakuotės pritaikytos naujiems laukams bei maršrutams.
  • 2026-06-18 — sesija 5

  • Naujas klientas AC (UAB Aconitum) — receptas, žaliavos, LOT/EXP, gamybos kortelės
  • Pouch kortelės UI — SUPAKUOTA → DĖŽĖS blokas (auto-skaičiuojamas)
  • Maišymo progresas — mini violetinis baras su % po pavadinimo
  • Kortelių stilius — mėlynas fonas, izoliuoti info barai, paryškintos spalvos
  • kliento_serija — naujas laukas, etiketėse gamintojo serija, važtaraščiuose mūsų LOT
  • IŠSIŲSTA baras — rodo sandėlio likutį (supakuota - išsiųsta)
  • Gamybos langas — užsakovo filtras, Maisomi rodo pradėtas korteles
  • Maišymo kortelė — landscape spausdinimas, pataisyta 1 maišymui formulė
  • OpenWolf — Agy atliko pilną projekto analizę, atnaujino visus .wolf/ failus
  • Auto-maišymo logika — receptas su ≤1 ingredientu automatiškai praleidžia maišymo etapą
  • kliento_serija kolona gamybos_korteles — etiketėse gamintojo serija, važtaraščiuose mūsų LOT
  • 2026-06-17 — sesija 4 (naktis)

  • Recepto tabs — 3 tab'ai recepto detalių panelėje: 📋 Sudėtis | ⚙️ Staklinė | 📝 Pastabos
  • _saveReceptasExtra(id) — saugo stakliu_rekomendacija + gamybos_pastabos per PUT
  • Gamybos kortelių pertvarkagamyba-row iš grid → viena flex eilutė su:
  • - gr-name-stack (180px): pavadinimas / LOT / EXP stacked vertikaliai

    - gr-mix-mini (88px): mini maišymo progress baras su ⚗ etikete ir procentu

    - 3× progress-block (flex:1 kiekvienas): PAGAMINTA / SUPAKUOTA / IŠSIŲSTA — originalaus dydžio

    - 🗑 mygtukas dešinėje + žalias „Arch.” kai allDone

  • Pašalinti ! statusas ir 🔍 atsekamumas mygtukai iš kortelės (per daug triukšmo)
  • Modal toggles — „⚙ Gamyba baigta” checkbox gamybos registracijos modale; „▣ Pakavimas baigtas” supakavimo modale
  • Baigtos būsenos — PAGAMINTA blokas tampa žalias + „BAIGTA ✓” kai stakles_baigtos; SUPAKUOTA lygiai taip pat kai pakavimas_baigtas
  • Multi-region kortele — gauna display:grid per inline style (nesulaužyta)
  • Agy kintamųjų pavadinimų klaidos prevencija — taisyklės instructions.md, agy-uzduotis.md, klaidos.md
  • #### ⚠️ Rytojui: Pouch kortelės tobulinimas

  • Pouch lange nereikalingas pakavimo baras (staklinė tiesiogiai pila į pakelius → dėžės)
  • Rodyti: pagamintas kiekis dėžėmis + likusių paketų skaičius
  • Išsiuntimas: tik dėžėmis
  • 2026-06-18 — sesija 1 (rytas - Agy)

  • Cerebrum.md atnaujinimas — pilnai dokumentuotos visos 15+ SQLite lentelių schemos ir visi 114 API endpoint'ų sugrupuoti pagal sritis.
  • Mobile UI plėvelių pajamavimas („Bulk Plėv.”) — atlikti patobulinimai:
  • - Receptų dropdown'e filtruojami tik plėvelės/stick tipai (paslėpti pouch receptai).

    - Pridėtas sėkmingo pajamavimo suvestinės konteineris (mBulkResultNotice), rodantis sugeneruotus LOT ir papildomus duomenis.

    - Perkelta inicializavimo logika į renderGavimas pabaigą, išsprendžiant tuščio vaizdo bug'ą perpiešiant (renderView()).

    - Sutvarkyta, kad formos laukai išsivalytų po sėkmingo išsaugojimo.

  • Dokumentacija — atnaujintas bendras agentų užduočių sąrašas [agent-tasks.md](file:///C:/VM/agent-tasks.md) ir užduočių žurnalas [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md).
  • 2026-06-19 — sesija 3 (Claude, pagrindinis darbas)

  • Naujas klientas SANTAMED — UAB "SANTAMED LT" (kodas SM), žaliava "Magnesium 375mg+B6 1.4mg powder", receptas "Olvel Magnesium 375mg+B6 1.4mg N30" (plevele, 11.16g, 30/dėž., 28 dėž./dėžėje), gamybos kortelė LOT 2026001, EXP 2028-05
  • GET /api/mobile/dashboard — naujas optimizuotas endpoint mobiliajai app. Vienas API call vietoj 7, ~10KB vietoj 1.5-2MB. Grąžina aktyvias korteles su server-side isvezta skaičiavimu, mėnesio KPI stats, counts, klientus, darbuotojus
  • Mobile v2 pilnas perrašymas (public/mobile.html) — premium dark glassmorphism dizainas (Revolut/N26 stilius):
  • - Quick Actions home screen (5 action kortelės: Staklės, Pakuoti, Maišyti, Priimti, Išsiųsti)

    - Swipe gestai (dešinėn=staklės, kairėn=pakavimas) su vizualiniu feedback

    - Card Detail bottom sheet su statistika ir quick register

    - 3 tab navigacija (Pultas, Kortelės, Daugiau) vietoj 7

    - Offline Queue infrastruktūra (localStorage, auto-sync, badge)

    - KPI chipai paspaudžiami — rodo produktų breakdown su medaliais

    - HR ekranas (viršvalandžiai, atostogos nuo-iki, tėvadienis)

    - Sandėlio likučių ekranas

  • KPI stats fixSTAKLĖS ✓ ir PAKAVIMAS ✓ baigimo žymos nebedubliuoja kumuliacinio kiekio KPI skaičiuose
  • KPI spausdinimo mygtukas — desktop index.html KPI panelėje pridėtas "Spausdinti" mygtukas su A4 landscape ataskaita
  • Telegram Mini Apptailscale funnel aktyvuotas (https://justas.tailf67d20.ts.net/), Telegram WebApp SDK integruotas, Mini App meniu mygtukas užregistruotas per BotFather API
  • Silent print per telefonąPOST /api/mobile/print endpoint: telefonas siunčia HTML → Playwright generuoja PDF → SumatraPDF (portable) tyliai spausdina ant HP LaserJet be jokio dialogo kompe
  • Važtaraščio spausdinimas — desktop stiliaus A4 portrait šablonas su paletėmis, suvestine, parašų vieta. Datos pasirinkimas, juoda/balta be fono, LOT+EXP serijos stulpelyje, pouch eilučių formatavimas, nepilnos dėžės PKTL./DĖŽ. stulpelyje, siuntėjas = "Justas Žukauskas"
  • Desktop UI — pašalinti gam/pak/sand pills iš kortelių pavadinimo zonos, "liko" info integruota į progress blokus; Santamed produktų filtras važtaraščio picker'yje pagal pasirinktą klientą
  • 2026-06-19 — sesija 2 (Agy)

  • Globalus grįžimo mygtukas (#headerBackBtn) — įdiegtas viršutiniame headeri, dešinėje pusėje prie laiktoduko ikonos, kuris dinamiškai rodomas sub-ekranuose (receiving, shipping, hr, sandelys) ir paslepiamas pagrindiniuose dashboard tabuose.
  • Navigacijos istorijos palaikymas — sukurtas _screenHistory stekas navigate(screen, params) funkcijoje ir globalus goBack() iškvietimas, leidžiantis sklandžiai grįžti į praėjusį langą (vietoj visada navigavimo į 'more').
  • Inline back mygtukų šalinimas — pašalinti visi dubliuojantys vidiniai grįžimo mygtukai (← Atgal) iš Priėmimo (renderReceiving), Važtaraščių (renderShipping), Darbo laiko (renderHR) bei Sandėlio likučių (renderSandelys) ekranų.
  • Priėmimo tipo pasirinkimo barai — pajamavimo tipų selektorius (renderReceiving) pakeistas iš atskirų žetonų (chips) į tab-bar stiliaus horizontalius barus (.tab-bar ir .tab-btn), sutapdinant jo dizainą su visa sistemos stilistika.
  • Išmanus maišymo registravimas — įdiegtas bazinės žaliavos pasirinkimas ir automatinis vienetų (vnt) kalkuliavimas pagal recepto sudėtį, siunčiant korektiškus { zaliava_id, svoris } parametrus į serverį.
  • Dokumentacijos atnaujinimas (db-schema.md) — prie klientai lentelės schemos aprašyti žinomi sistemos klientai ir papildyta naujo kliento SM (UAB "SANTAMED LT") rekvizitais.
  • 2026-06-19 — sesija 1 (Agy)

  • Telegram bot isvezta_kiekis pataisyma (telegram-bot.js) — išspręsta klaida, kai botas naudojo neegzistuojančią c.isvezta_kiekis koloną iš gamybos_korteles. Sukurtas getIsvezta(lot, recPav) helperis dinamiškai sumuoti išsiuntimus iš gamybos_zurnalas.
  • Viršvalandžių modulio (HR) patobulinimai (public/mobile.html, server.js) — perkeltas tipų pasirinkimas į tab-bar stiliaus kontrolę, viršvalandžių balansas apribotas einamuoju mėnesiu, pridėtas istorijos išskleidimas paspaudus ant balanso kortelės, įdiegtas konkretaus mėnesio pasirinkimas su atitinkamu istorijos ir balanso filtravimu, bei pataisyti backend maršrutai, kad SQLite duomenų bazėje būtų išsaugotas tipas (Atostogos/Tėvadienis/Darbas).
  • Mobiliosios aplikacijos UI supaprastinimas (public/mobile.html) — pultas dabar rodo tik KPI suvestinę ir aktyvias gamybos korteles, pašalinti sub-tabai iš „Kortelės“ rodinio, o gamybos kortelių detalių modaliniame lange pridėtas „🧪 Registruoti maišymą“ veiksmas. Visos specifinės valdymo funkcijos ir filtrai perkelti po „Daugiau“ meniu ekranu.
  • 2026-06-22 — sesija 1 (Agy)

  • Užduotis #10 — Naujų projekto protokolų patvirtinimas:
  • - Perskaitytas ir patvirtintas [AGENTS.md](file:///C:/VM/AGENTS.md) su nustatytomis agentų atsakomybėmis, apribojimais ir saugumo hook'o taisyklėmis.

    - Atnaujinta sesijos pradžios rutina, įtraukiant naująjį rolių dokumentą (dabar skaitomi 5 failai prieš pradedant darbą).

    - Įrašytas patvirtinimas į [agy-uzduotis.md](file:///C:/VM/agy-uzduotis.md).

  • Sisteminių nurodymų (system prompts) nutekėjimo analizė:
  • - Išanalizuota „GitHub“ repozitorija system_prompts_leaks bei atskirai peržiūrėti nutekinti Google Antigravity CLI nurodymai, patvirtinantys esamą agento elgseną.

    ---

    9. TOOLS / SKILLS

    Aktyvūs

  • /si:remember — išsaugoti žinojimą į atmintį
  • /si:review — atminties sveikatos patikrinimas
  • /wolf — projekto žemėlapis naršyklėje (http://localhost:3000/wolf)
  • Obsidian — šis failas kaip vault (C:\VM\.wolf\)
  • Telegram Botas — integracinis botas (telegram-bot.js), startuojamas kartu su Express serveriu.
  • Atmintis

  • ~/.claude/projects/C--VM/memory/MEMORY.md — automatinė Claude atmintis
  • .wolf/cerebrum.md` — rankinis žinių žemėlapis (šis failas)
  • VM Projekto Failų Anatomija

    > [!info] Naudojimas

    > Šis failas — failų žemėlapis. Patikrink prieš atidarant bet kokį failą.

    > Pilna projekto logika → [[cerebrum]]

    Atnaujinta: 2026-08-11

    ---

    Šaknis C:\VM\

    ``

    C:\VM\

    ├── server.js ← PAGRINDINIS BACKEND (Express, SQLite, visos API)

    ├── CLAUDE.md ← Claude instrukcijos (OpenWolf + projekto taisyklės)

    ├── agy-uzduotis.md ← Agy ↔ Claude komunikacijos kanalas

    ├── agent-tasks.md ← Bendrų agentų užduočių sąrašas

    ├── bf-receptai-draft.md ← Agy juodraštis: BF receptų ekstraktas iš senos xlsx (importuota 2026-07-02)

    ├── of-titan-likuciai-analize.md ← OF/Vital Titan Complex žaliavų likučių analizė (Sheets vs DB, 2026-07-03)

    ├── bf-zaliavu-likuciai-analize.md ← BF žaliavų likučių analizė (Sheets vs DB, dar NEPERKELTA į DB, 2026-07-04)

    ├── titan-premix-analize.md ← TITAN premix 2 receptų analizė (Agy #26) + išmanaus maišymo pasiūlymas (2026-07-08)

    ├── bf-migracijos-planas.md ← BF žaliavų likučių migracijos planas A/B/C/D (Agy #29; importas ĮVYKDYTAS 2026-07-09)

    ├── mobile-api-auditas.md ← Mobile ↔ API laukų neatitikimų auditas (Agy #30; kritiniai fix'ai 2026-07-10)

    ├── _backup_auto ← /cm automatinės kopijos (DB snapshot + zip; 7 naujausi, gitignore)

    ├── .claudecommandscm.md ← /cm komanda: commit + DB snapshot + zip + push

    ├── .env.example ← Aplinkos kintamųjų šablonas

    ├── start-background.ps1 ← Windows auto-start skriptas

    ├── terminal-server.js ← Web terminalas (port 3001) — mobiliems

    ├── gamybos_ciklas.js ← Gamybos ciklo logikos modulis

    ├── gamybos_langas.js ← Gamybos lango UI logikos modulis

    ├── faktinis_sunaudojimas.js ← Faktinio sunaudojimo skaičiavimai

    ├── telegram-bot.js ← Telegram botas (integruotas ir valdomas iš server.js)

    ├── darbuotojai.json ← Darbuotojų sąrašas (vietinis registras)

    ├── code-reviewer.bat ← Paleidžia /code-review skill

    ├── photo-analyzer.bat ← Nuotraukų analizės paleidimas

    ├── omni-agent.bat ← OmniRoute/omni agent paleidimas

    ├── setup-autostart-task.ps1 ← Auto-start užduoties kūrimas (SYSTEM scheduled task, reikia admin — 2026-08-14 rastas dingęs, žr. cerebrum)

    ├── watchdog.ps1 ← (2026-08-14) kas 5 min tikrina ar serveris gyvas+atsako HTTP, restartuoja per start-background.ps1; VM-Watchdog scheduled task (be admin teisių)

    ├── ssh-setup.ps1 ← SSH prieigos konfigūracija (Tailscale)

    ├── run-server.bat, start.bat, dos.bat ← Serverio/daemon paleidimo trumpiniai

    ├── installer-build/ ← Installer/build aplinka (sandbox testai, ai-tools/)

    ├── ai-tools/ ← AI įrankių diegimo skriptai

    ├── headscale/ ← Headscale (Tailscale kontrolės serveris) konfigūracija

    ├── public/

    │ ├── index.html ← DESKTOP UI (~15k eilučių)

    │ ├── mobile.html ← MOBILE UI v3 (dviguba tema tamsi/šviesi, aurora, PTR, haptika, ~4000 eil.)

    │ ├── index_backup_2026-07-04.html ← Senoji desktop versija (backup)

    │ └── mobile_backup_2026-07-04.html ← Senoji mobile versija (backup)

    ├── tools/

    │ └── SumatraPDF-3.5.2-64.exe ← Silent PDF printing (naudoja /api/mobile/print)

    ├── pb_data/

    │ └── data.db ← VIENINTELIS DB ŠALTINIS (SQLite)

    ├── .wolf/ ← OpenWolf sistema

    │ ├── OPENWOLF.md ← Sistemos taisyklės

    │ ├── cerebrum.md ← Projekto smegenys [[cerebrum]]

    │ ├── anatomy.md ← Šis failas

    │ ├── HOME.md ← Obsidian pradinis puslapis

    │ ├── db-schema.md ← DB lentelės detaliai

    │ ├── workflow.md ← Gamybos ciklas žingsnis po žingsnio

    │ ├── pakuotes.md ← Pakuočių tipai ir sandėlis

    │ ├── klaidos.md ← Žinomos klaidos ir sprendimai

    │ ├── Atidaryti-Obsidian.bat ← Greitas Obsidian paleidimas

    │ └── .obsidian/ ← Obsidian konfigūracija

    ├── .claude/ ← (gitignored, tik lokalus šis kompiuteris)

    │ ├── settings.json ← self-improving-agent hook + block-dangerous PreToolUse

    │ ├── settings.local.json← Vietiniai leidimai

    │ ├── hooks/

    │ │ └── block-dangerous.sh ← blokuoja rm -rf/, git reset --hard, force push, DROP TABLE,

    │ │ pb_data trynimą (2026-07-02)

    │ ├── commands/ ← /cm, /commit, /verify?, /update-wolf, /tgc, /tg, /inv (2026-08-14, inventorizacijos-per-nuotraukas sprendimų medis), /check-server, /doubt, /interview, /spec

    │ └── skills/ ← (2026-08-11) wmux, orca-cli, orchestration, wmux-browser (žr. [[cerebrum]] §9)

    ├── DRIVE/

    │ └── telegram-foto/ ← Telegram foto inbox (nuotrauka+.json kiekis, žr. [[cerebrum]] 2026-07-04)

    ├── failai/ ← Įkelti failai (Excel, PDF importui)

    ├── logs/ ← Serverio žurnalai

    └── node_modules/ ← NPM pakuotės (neredaguoti)

    `

    ---

    Svarbiausi failai pagal darbą

    🔧 API keitimas

    server.js

    🖥️ Desktop UI keitimas

    public/index.html (~15k eilučių — labai didelis, naudoti Grep prieš Read)

    📱 Mobile UI keitimas

    public/mobile.html

    🗄️ DB schema tikrinimas

    pb_data/data.db + server.js migracijų sekcija viršuje

    ⚙️ Gamybos ciklo logika

    gamybos_ciklas.js + gamybos_langas.js

    📨 Agy agento užduotys

    agy-uzduotis.md

    🧠 Projekto kontekstas

    .wolf/cerebrum.md` ([[cerebrum]])