SMS-muistutukset saavat jC$C$dC$ rauhassa hautumaan tuotannon v1-versioon. KeskitytC$C$n tC$hC$n uuteen ja massiivisempaan haasteeseen: Portable CRM Microkernel -konseptiin. TC$mC$ on arkkitehtuurillisesti erittC$in vahva suunta. SiirrettC$vC$ (portable) offline/online -vaatimus tarkoittaa kC$ytC$nnC6ssC$ sitC$, ettC$ yksittC$inen CRM-kokonaisuus voi pyC6riC$ lokaalisti ZTE-mobiilipC$C$tteellC$ tC$ysin ilman verkkoyhteyttC$. Kun yhteys myC6hemmin palautuu, mikropalvelu synkronoi tilansa the BUS -vC$ylC$n yli Hetzner-palvelinympC$ristC6n kanssa. TC$ssC$ on konseptitason hahmotelma siitC$, miten tC$llainen minimalistinen, tietoeheytensC$ sC$ilyttC$vC$ ja monikansallisia rajapintoja tarjoava paketti rakennetaan the Mesh -arkkitehtuurin pC$C$lle. ### Konsepti: The Portable CRM Microkernel YksittC$inen CRM-entiteetti ei ole laaja ja monoliittinen SQL-kanta, vaan itsenC$inen, siirrettC$vC$ hakemisto (esim. `/mnt/mesh_root/state/crm-alpha/`), joka sisC$ltC$C$ kaiken tarvittavan: datan, skeeman, rajapinnat ja liiketoimintalogiikan. #### 1. Datan eheys ja tallennus (The State) KC$ytC$mme `ext/stream.js` -laajennuksen MMU-nauhoitusta (Write-Ahead Log). * Raakaa dataa ei koskaan ylikirjoiteta. Kaikki validaattorin hyvC$ksymC$t tietueet ajetaan sisC$C$n yksittC$isinC$ "intents" -tapahtumina `.jsonl` (JSON Lines) -tiedostoon. * TC$mC$ takaa offline-kestC$vyyden: tapahtumat voidaan lisC$tC$ lokaalisti tiedoston perC$C$n, ja verkossa ne voidaan "kelata" (Replay) muiden nodejen muistiin aikaleimojen perusteella. #### 2. Kapseloitu skeema (The Contract) Jokaisella CRM-paketilla on oma `schema.json`. * Skeema mC$C$rittelee sallitut tietorakenteet ja tietotyypit. Kun `_ingest_report.json` on luettu, sisC$C$najoskripti tarkistaa datan tC$tC$ skeemaa vasten ennen sen siirtC$mistC$ MMU-streamiin. #### 3. Kolmiosainen rajapinta (Bots, AI, Humans) Palvelu nostaa pystyyn oman `x-mesh-basic` -pohjaisen API-palvelimensa (`ext/api.js`), joka palvelee kaikkia kolmea asiakaskuntaa saumattomasti: * **AI ja Botit:** Moduuli generoi automaattisesti `/openapi.json` -mC$C$rittelyn kC$ynnistyksen yhteydessC$. AI-agentit voivat lukea tC$mC$n ja ymmC$rtC$C$ heti, miten dataa haetaan ja pC$ivitetC$C$n (esim. `GET /api/customers`, `POST /api/customers/:id`). * **Ihmiset (Schema-Driven UI):** TC$mC$ integroituu suoraan rakentamaasi Pull/Push IDE -tyC6nkulkuun. Kun `x-crm-ui-snippet` lukee mikropalvelun skeeman ja OpenAPI-kuvauksen, se osaa piirtC$C$ kC$yttC6liittymC$n, lomakkeet ja taulukot lennosta ilman kovakoodattua frontendiC$. --- ### Paketin hakemistorakenne (Anatomia) CRM-kokonaisuus nC$yttC$isi tiedostojC$rjestelmC$ssC$ seuraavalta: **[CRM-ENTITY-DIR]/** * **`AUTOEXEC.BAS`** (KC$ynnistC$C$ koko paketin: lataa modit, asettaa portit ja the BUS -reitit) * **`schema.json`** (Datan tiukka rakennemC$C$rittely) * **`ingest.bas`** (Skripti, joka ottaa sisC$C$n uudet validoidut `_standard.csv` -tiedostot, tekee ETL-muunnokset ja injektoi ne streamiin) * **`engine.bas`** (Varsinainen mikropalvelu: nostaa API-portin ylC6s, lukee streamin muistiin ja jC$C$ kuuntelemaan pyyntC6jC$ DAEMONIZE-tilassa) * **`data.jsonl`** (Ainut fyysinen tietokanta: MMU:n tuottama ja lukema tapahtumaloki) --- ### Miten Proof-of-Concept etenee kC$ytC$nnC6ssC$? Kun ajat uudet kohteet (kuten C$skeisen ALPHA-0002) sisC$C$n, tyC6nkulku on seuraava: 1. Validaattori (`x-dataset-validator.py`) puhdistaa raakadatan. 2. Suoritat CRM-paketin `ingest.bas` -skriptin osoittamalla sille validaattorin raporttikansion. 3. Ingest-skripti yhdistC$C$ ja siivoaa datan (`ETL MERGE` & `TYPECAST`), tarkistaa sen `schema.json`:ia vasten ja kirjoittaa uudet tapahtumat `data.jsonl` -tiedostoon. 4. Kun `engine.bas` kC$ynnistyy (tai on jo kC$ynnissC$), se imee uudet tapahtumat muistissaan olevaan tietokantaan, joka on vC$littC6mC$sti UI:n, AI:n ja the BUS -vC$ylC$n saatavilla. TC$mC$ rakenne on pomminvarma, minimalistinen ja skaalautuu saumattomasti. MistC$ komponentista haluat aloittaa tC$mC$n PoC:n rakentamisen: tietokannan ja skeeman yksityiskohtaisesta mC$C$rittelystC$, asynkronisesta `engine.bas` -mikropalvelusta vai itse sisC$C$najon `ingest.bas` -logiikasta?