🌳
Forestsense OS
Vaheaudit · TerraNervus + TimberTrace + LADU · 2026-05-23

Vaheaudit — Forestsense süsteemiarhitektuur (6+2 kihtide vahekord)

Kaks arendust (TerraNervus visualiseering+AI ja TimberTrace audit+EUDR) ei ole vahetult liidesed — nad mõlemad telisid LAOST. Õige küsimus pole "kuidas need integreeruvad", vaid "kuidas Forestsense LADU + lepped + applikatsioonid on selgelt eraldatud nii, et iga rakendus elab loose-coupled tellija rollis". Karpathy-stiilis data-as-a-product mõtteviis. Vaheauditi tulemus: integreeritavad probleemivabalt JAH — aga vajab keskselt koordineeritud LADU + lepped, mitte rakenduste-vahelisi liidesi.
Autor: VS Eirik Sessioon: 2026-05-23 Meetod: Harness Protocol (Erki Planner → mina Generator → 3 Plan Evaluator agendi) Allikad: 2 üleandmis-protokolli + Phase A inventuur (56 tabelit + 12 Edge Functions + 31 skilli) Brand: TerraNervus (pos_deep_memory id=591)

§1 Lühikokkuvõte

Strateegiline tähelepanek

TerraNervus ja TimberTrace ei lähe omavahel ühendusse — see oli mu esimene plaani-raami viga. Erki Karpathy-peegelduse järgi need on kaks iseseisvalt müüdavat applikatsiooni mis mõlemad telivad LADUST. Tegelik koordineerimis-vajadus on LADU + lepete tasandil, mitte rakenduste-vahel.

3 küsimust + vastused

Integreeritavad probleemivabalt?
JAH  — kui LADU eraldame rakendustest 6+2 mudeli järgi. Praegu on 13 cohesion-rikkumist (vt §4) mis tuleb parandada, kuid arhitektuuriline alus on terve.
Vajab tsentraalset koordineerimist?
JAH  — mitte rakenduste vahel, vaid LADU + Lepete tasandil. PR #99 kandidaat "Data product ownership" + 00_alus/ladu_v1.md SSOT + layer_tag metadata.
Müüdavad eraldi?
JAH MÕLEMAD  — Müügimees pakib 4 paketti A→D (vt §6.E): Audit Pakk A (€8-15k EUDR sissetõmme), AI Pakk B (€20-30k upsell), Full Platform Pakk C (€40-60k), Data API Pakk D (€500-2k/kuu partnerite-võrgustik).

TL;DR action items (3 P0 punkti)

§2 Forestsense süsteemiarhitektuur — 6+2 mudel

Erki Karpathy-stiilis peegeldus 2026-05-23 (täistsitaat säilitamiseks):
"applikatsioonid ei tohi olla hardcoded omavahel kokku, vaid neid seob andmete kasutamine samas laost ja üksteise täpselt sõnastatud tellimuste täitmine, mille tulemusena moodustub terviktoode UI-s ja selle kasutajal pole aimugi et seal taustal on palju applikatsioone mis on seamlessly integrated for greatest user experience."

Mudel — 6 kihti + 2 cross-cutting

KIHT 6APPLIKATSIOONID + UX TimberTrace · TerraNervus · Janis UI · NW finantsdashboard · 3rd-party Alamkiht 6.UX: Forestsense Design System · TerraNervus brand │ tellimused (typed contracts) KIHT 5LEPPED & REEGLID 5A. API leppe: Supabase REST · RPC · Edge Functions HTTP 5B. Compliance: EUDR DDS · KPDC formaat · Direktiiv 2018/2001/EÜ 5C. Äri-reeglid: hinnakirjad · koefitsendid · sortimendi-vasted 5D. Workflow: TimberTrace 11 etappi · NFA pre/post · raie-protsess 5E. Orkesteerimine: cron · Task Scheduler · agent_messages relay 5F. Sõnastik: forestsense_os_sonastik.md · termini-mapping │ tähenduslikud andmed KIHT 4SEMANTIKA pos_deep_memory · search_bge_m3 RPC · sõnastik-mapping Graphify G-kiht (10 kausta ~2954 sõlme) │ embeddings, model outputs KIHT 3COMPUTE / MODEL (füüsiline ressurss) Jetson AGX Orin 64GB · L4T PyTorch GPU · Tailscale tunnel BGE-M3 1024-dim · Llama 3.1-8B + 3.3 70B · YOLOv8n NVDLA │ töödeldav andmebaas KIHT 2LADU (üks tõe-allikas) 2A. Ruumi+tabel ühendatud: lvm_* + tma_* + kpdc_* + cirsmas + nogabali 2B. Kirjeldav ruum: Sentinel-2 · ortofoto · LiDAR · LVM publicwfs 2C. Tabelandmed ilma loodusega: directo_* · NW finantsid · bilanss 2D. Data products: synth_* · v_changelog · tma_workorder_match 2E. Master data: unit_mapping · ettevõtte-ID master · jobcode kataloog 2F. Temporal: watchdog_log · sync_log · updated_at · synced_at │ toored andmed välismaailmast KIHT 1INGEST (ETL välismaailmast) LVM Geo (3 API'd) · KPDC · EVR · Directo · HPR/PRD XML Santa SharePoint · Sentinel-2 STAC (tulevikus) CROSS-CUTTING — puudutab kõiki kihte +A IDENTITEET & RLS: Supabase auth · service/anon-key · RLS · multi-tenant +B AUDIT & VAATLUS: agent_messages · session_manifests · v_changelog · ops_board

Kihtide rollid Karpathy-stiilis

Kiht 1

INGEST
"Välismaailma toore vastu LADU samasugune."
12 Edge Functions + 3 ingest-skilli. ETL → LADU.

Kiht 2

LADU
"Üks tõe-allikas. Iga number kuulub ühele veerule ühele tabelile."
56 tabelit jagatud 6 alamkihti (2A-2F). Sh: 5 data products, 6 master, 3 cache.

Kiht 3

COMPUTE / MODEL
"Füüsiline ressurss kus mudelid jooksevad. Vahetatav riistvara."
Jetson AGX Orin 64GB · L4T PyTorch · BGE-M3 + Llama 3.1/3.3 + YOLOv8n

Kiht 4

SEMANTIKA
"Tähendus ja seosed. Memory ≠ data — memory is curated."
pos_deep_memory 524 · search_bge_m3 RPC · Graphify G-kiht 2954 sõlme

Kiht 5

LEPPED & REEGLID
"Mis on lubatud, kuidas tellida, millal käivitub."
6 alamkihti (5A API · 5B compliance · 5C äri-reeglid · 5D workflow · 5E orkest. · 5F sõnastik). 4 leppe-skilli.

Kiht 6

APPLIKATSIOONID + UX
"Tellijad. Vahetatavad kasti vastu. Kasutaja ei tea taustal."
15 APP-skilli (TimberTrace, TerraNervus, NW dashboard, Janis UI, ...) + Forestsense DS

Cross +A

IDENTITEET & RLS
"Kes ja millise rolliga puudutab."
19 tabelit RLS-ita — vt §4 R11. Multi-tenant kandidaadid: NW · Vestman · EPMK · 3rd-party

Cross +B

AUDIT & VAATLUS
"Mis juhtus, kelle poolt, millal."
agent_messages 1341 · watchdog_log 8430 · session_manifests 34 · ops_board.html · check_response_format()

Eelmise raami võrdlus (v1, hüljatud): Vaatasin TerraNervus ↔ TimberTrace kui kahte rakendust mis omavahel liidestuvad. Erki Karpathy-peegeldus näitas et see oli vale raam — nad mõlemad telisid LAOST ja ei lähe omavahel ühendusse. Kogu integratsioon toimub lepete kaudu, mitte rakenduste-vaheliselt.

§3 Olemasolev seis — täielik artefaktide kataloog

Phase A inventuur (2026-05-23 hommik): kõik Supabase tabelid, Edge Functions ja skill-failid klassifitseeritud 6+2 mudeli järgi. Eesmärk: kontrollida, kus reaalsus juba ühtib mudeliga ja kus on kohad ümberkujundamiseks.

§3.1 Supabase tabelid (56 public schema)

KihtTabelidRidade arv kokku
LADU 2A ruumi+tabelfeatures 3468 · lvm_parcels 1032 · lvm_fells 175 · lvm_cirsmas 1133 · lvm_nogabali 6875 · lvm_works 2813 · lvm_service_providers 68 · tma_files 59 · tma_stems 46610 · tma_tracking 100653 · tma_objects 58 · kpdc_documents 179 · kpdc_tp_measurements 0 · evr_transport_docs 160 · santa_saatelehed 1 · timbertrace_deliveries 0 · w1_pavadzimes 0 · lvm_kkparcel_cache 1 · lvm_compartments_cache 50 · lvm_road_cache 2~163k
LADU 2B kirjeldav ruum(välised allikad, pole imporditud — Sentinel-2 STAC ootel)
LADU 2C tabel ilma loodusegadirecto_transactions 20342 · directo_invoices 506 · directo_purchases 1215 · directo_invoice_lines 0 · directo_objects 1471 · price_lists 5 · price_components 249 · coefficient_history 2 · market_quotes 7 · market_fundamentals 1 · sec_filings 39 · insider_transactions 0 · nse_corporate_filings 0 · meeting_versions 2 · personalos_waitlist 0 · toftan_warehouse_stock 0~24k
LADU 2D data productsaudit_findings 0 · transport_verifications 0 · invoice_verifications 1 · payment_schedule 0 · directo_kogus_lookup 0 · pr_rules 31 · pos_agent_compliance 1850
LADU 2E master dataunit_mapping 83 · attribute_definitions 0 · data_sources 22 · skills_registry 22 · integration_inventory 46 · agent_registry 18191
LADU 2F temporalwatchdog_log 8430 · task_state_log 0 · sync_log 380 · observations 0 · feature_relations 0 · lvm_etl_sync_log 08810
Kiht 4 SEMANTIKApos_deep_memory 524 · agent_state 14538
Kiht 5E orkest.agent_messages 1341 · agent_tasks 11342
Cross +B AUDITsession_manifests 3434
Postgres süsteemnespatial_ref_sys 00

Tähelepanek: LADU 2D (data products) on hetkel ainult 50 rida 5 tabelis. See on alarm — kasvab kiirelt kui 3 paketti × 11 etappi × N kliendid. Vt §4 R12 + §6 soovitused.

§3.2 Edge Functions (12 ACTIVE)

KihtEdge FunctionRoll
Kiht 1 INGESTt4-sync · directo-sync · evr-sync · parse-tma · directo-xml-probe · hpr-prd-ingestETL välismaailmast LADU 2A/2C tabelitesse
Kiht 3 COMPUTEembed-messageBGE-M3 embedding generation (HTTP API → Jetson või cloud GPU)
Kiht 4 SEMANTIKAsearch-memoryRPC otsing pos_deep_memory peal (cosine similarity)
Kiht 5B+6 SEGAeudr-dds-pdfRIKKUMINE R12 — compliance (5B) + PDF render (6) ühes funktsioonis
Kiht 6 APPred-team-triggerRed team workflow trigger
Cross +Ahandle-new-userAuth callback
Cross +Baudit-advisorCompliance audit advisor

§3.3 Skill failid (31 faili)

KihtSkill failid
Kiht 6 APPS (15)timbertrace-audit · timbertrace-ui · kaardi-aju · noukogu · nw-kinnistu-optimizer · raie-arve-verifitseerimine · hinnakirja-koefitsent · harvester · harvesting-project-audit · tonaalsus · disainer · market_data · talveuni-raport · reporting · excel-os
Kiht 5 LEPPED (4)eudr-dds · tma-hpr-spatio-temporal-matching · agent-messaging-bus · documentation-routines
Kiht 1 INGEST (3)kpdc-saatelehed · lvm-geo-kaart · directo
Kiht 3 COMPUTE (1)jetson-l1-memory
Kiht 4 SEMANTIKA (2)l1-malu-loomise · nas-mcp-kasutamise
Cross-cutting (6)harness-team-protocol · saastureeglid · sessiooni-lopetamise · v1-verification · vestluste-ylekulamise · data-analyst

§3.4 Dokumendid (00_alus/ — valikud)

KihtFailid
Kiht 5F sõnastikforestsense_os_sonastik.md · CLAUDE.md (käitumusreeglid) · pos_onboarding_v1.md
Kiht 2 LADUSupabase_skeem_v1.md · reference_supabase_schema_LIVE.md (cron) · andmeallikate_kataloog_v1.md · timbertrace_seis_v1.md · tma_vs_harvester_eristus_v1.md · tma_vs_hpr_prd_eristus_v1.md · harvester_andmete_3_allikat.md · timbertrace_kolm_sisendit.md · ladu_v1.md PUUDUB
Kiht 6 APP-specproject_kaardi_aju_v0.md · ssot_timbertrace.md · NW_laenu_strateegia_v0.md · NW_noukogu_kontekst_kiirviide.md · Disainer_v0.md
Cross +A IDENTITEETLigipaasumaatriks_v0.md · identiteet_v1.md PUUDUB
Cross +B AUDITmemory_audit_v1.md · malu_arhitektuur_v1.md · agendi_uurimine_v1.md · session_manifests audit
Arhitektuur (üldine)Hybriid_arhitektuur_v1.2.md · Eiriku_arhitektuur_v1.md · ForestSense_Team_Arhitektuur_v2.0.md · Agentide_arhitektuur_v1.md · Sustematiseerimise_plaan_v1.md

Kataloogi-tähelepanek: Kolm faili puuduvad mis on uue 6+2 mudeli aluseks: 00_alus/ladu_v1.md (LADU SSOT), identiteet_v1.md (RLS coverage matrix), compute_jetson_v1.md (Kiht 3 hardware SSOT). Need on P0/P1 action item'id (§7).

§4 Diagnoos — 13 cohesion/coupling rikkumist

Mu esmane (Generator) diagnoos andis 8 rikkumist. Arhitekt Plan-agent kinnitas need + lisas 5 (R9-R13). Kõik 13 on klassifitseeritud raskuse ja kihtide järgi.

§4.1 Algsed rikkumised (Generator) — 8

R1synth_* materialized view'd "kuuluvad TerraNervus'ele"KRIITILINE
Praegu: kaardi-aju-skill.md §3 dokumenteerib synth_lepingu_risk · synth_sortiment_heatmap · synth_nfa_overlap kui TerraNervus omandust
Tegelikkus: andmed (KPDC items, lvm_cirsmas planned_m3, tma_tracking convex hull) on LADU. Materialized view on LADU 2D data product mille konkreetne tarbija on (täna) TerraNervus, aga teiste rakenduste (3rd-party, Janis UI) tarbimine peaks olema avatud.
Parandus (P0 #2): Migration 0049 — ALTER MATERIALIZED VIEW + COMMENT 'LADU 2D data product, owner: data-team, refresh: 06:00, consumers: terranervus + janis + 3rd-party API'
R2pos_deep_memory.embedding_bge_m3 + Kiht #0 cronKRIITILINE
Praegu: kaardi-aju-skill.md §4 dokumenteerib Kiht #0 Memory Coherence Layer kui TerraNervus tellingu
Tegelikkus: embedding-veerg on SEMANTIKA Kiht 4 contract; embedding-generation on Kiht 3 (embed-message Edge Function); cron on cross-cutting +B AUDIT. TerraNervus on tarbija, mitte omanik.
Parandus (P1): vt §6.C — uus skill semantika-kiht-skill.md + RPC search_bge_m3() + tarbijate loend (TerraNervus, Janis UI, TimberTrace sisendite L1, ...).
R3tma_workorder_match "kuulub TimberTrace'ile"OSALINE
Praegu: tma-hpr-spatio-temporal-matching-skill.md dokumenteerib seda kui TimberTrace tellingu
Tegelikkus (Arhitekt täiendus): tabel/view on LADU 2D data product; matching-reegel (3-tasandi spatial-temporal join) on LEPPED 5C äri-reegel. Skill segab nähtuse ja reegli.
Parandus (P1): jaota skill kaheks. tma-workorder-match-data-product.md (LADU 2D — view definitsioon) ja spatio-temporal-matching-rule.md (LEPPED 5C — algoritm + parameetrid ε_dist, ε_time).
R4EUDR DDS reeglid kodeeritud eudr-dds-pdf Edge Function'iKRIITILINE
Praegu: eudr-dds-pdf v2 Edge Function (id=a8ca20aa) sisaldab compliance-loogikat + HTML/PDF renderdust ühes index.ts failis
Tegelikkus: EUDR Art 4.3 reegel (seemnepuude tihedus, riigi-spetsiifika) on LEPPED 5B compliance. PDF render on Kiht 6 APP-loogika. Kui Janis UI vahetab disaini, peab compliance-reegleid uuesti deployma.
Parandus (P1): jaota Edge Function kaheks — eudr-dds-compliance (JSON väljund) + render-pdf-from-template (HTML-engine).
R5Hinnakirjad ja koefitsendid raie-arve-verifitseerimine-skill'isOSALINE
Praegu: raie-arve-verifitseerimine-skill.md sisaldab arvutus-valemeid (fuel/base)^0.70 × (wage/base)^0.30 + "üle 5% = lipp"
Tegelikkus (Arhitekt täiendus): tabelid (price_lists, price_components, coefficient_history) on LADU 2C; arvutus-valem + threshold "üle 5% = lipp" on LEPPED 5C äri-reegel. Skill segab andmed + reeglid + UI-loogika.
Parandus (P1): loo SQL view v_active_coefficient (LADU 2D) + verify_invoice_rule RPC (LEPPED 5A). Skill kasutab RPC-d, mitte ei rakenda otse.
R6Sõnastik (forestsense_os_sonastik.md) markdown-failinaOSALINE
Praegu: forestsense_os_sonastik.md on git'i mees-loetav markdown, ei ole tabel ega API
Tegelikkus: kui Erki tahab "masinaloetav lepingute keel", siis sõnastik peab olema LADU 2E master-tabel (terms_dictionary) + view v_sonastik (LADU 2D). Markdown jääb dokumentatsiooniks kogemus-stiilis.
Parandus (P1): migration 0050 — terms_dictionary tabel + ETL skript md → tabel (cron iga öö). Vt §6.D.
R7LADU dokumentatsioon puudubKRIITILINE
Phase A inventuur kinnitas: 00_alus/ladu_v1.md ei eksisteeri. Supabase_skeem_v1.md on tabelite-loend (vt §3.4).
Tegelikkus: ilma LADU SSOT-fail (alamkihtide 2A-2F klassifikatsioon, owner-skill per tabel, RLS-staatus per tabel, FK-graaf, data products kataloog), pole tsentraalset koordineerimist võimalik.
Parandus (P0 #1): loo 00_alus/ladu_v1.md — kogu Kiht 2 SSOT. Üks tõe-allikas LADU-le. Kategoorialahter ka pos_deep_memory ja agent_messages multi-kihi-paradoksile (vt §4.3 ja Skeptik leid).
R8Identiteet & RLS pole eraldi dokumenteeritudKRIITILINE
19 tabelit RLS-ita (Phase A inventuur, advisory critical): spatial_ref_sys · personalos_waitlist · skills_registry · market_quotes · market_fundamentals · sec_filings · insider_transactions · nse_corporate_filings · integration_inventory · lvm_fells · lvm_parcels · lvm_service_providers · lvm_nogabali · lvm_cirsmas · lvm_works · timbertrace_deliveries · santa_saatelehed · toftan_warehouse_stock · lvm_etl_sync_log
Tegelikkus: kui anon-key on avalik, on need 19 tabelit kõigile loetavad ja kirjutatavad. +A IDENTITEET fundamentaal-rikkumine, mitte nice-to-have.
Parandus (P1): loo identiteet_v1.md + Migration 0051 RLS coverage. ENABLE ROW LEVEL SECURITY + per-table policy (kasvõi FOR ALL USING (true) eksplitsiitselt + audit-trail).

§4.2 Arhitekt-agendi täiendused — R9-R13

R9features tabel (3468 rida) omanikutaPEEN
PostGIS geo-objektide tabel, viide data_sources.id. Aga skillid (lvm-geo-kaart, kpdc-saatelehed, ...) viitavad lvm_* ja kpdc_*, mitte features-le. Üldine "geo-staging" sahtel mille omanikuks pole keegi.
Parandus (P1): kas sulgeda (DROP) või vormistada ametlikuks LADU 2A.0 "geo-staging" alamkihiks koos owner-skilliga.
R10Master-tabelite triple-overlap: agent_registry ∩ skills_registry ∩ integration_inventoryPEEN
3 master-tabelit (18+22+46 rida) kirjeldavad osaliselt sama: "mis komponendid Forestsense'is eksisteerivad". skills_registry.usable_by viitab agentidele, integration_inventory võib sisaldada Edge Function'eid mis on ka agendid.
Parandus (P1): lukusta scope PR #99 lisana. agent_registry = autonomous actors. skills_registry = reusable knowledge modules. integration_inventory = external endpoints (URL + auth).
R1119 RLS-ita tabelit = +A kihi loomine ilma policy-coverage matrixitaKRIITILINE (kordab R8)
Praegu cross-cutting +A on mainitud aga mitte täidetav. lvm_* (8), santa_saatelehed, timbertrace_deliveries, toftan, skills_registry, market_*
Parandus (P0/P1): loo enforce_rls.sql migration + CI hook mis blokeerib uue tabeli loomise ilma RLS policy-ta.
R12eudr-dds-pdf Edge Function kaks vastutusala (kordab R4 teisest vaatest)OSALINE
Edge Function id=a8ca20aa, version 2. Kompileeritud kood sisaldab compliance + render.
Parandus: kaks Edge Function'i — eudr-dds-compliance (Kiht 5B, JSON {du_code, status, vol_m3, geom_centroid, partners[]}) + render-pdf-from-template (Kiht 6, HTML→PDF).
R13price_lists/price_components/coefficient_history = LADU 2C + LEPPED 5C hübriidPEEN
Tabelid on 2C (ilma loodusega). AGA coefficient_history semantics ("aktiivne koefitsent NOW") on lepped-reegel mis kuulub 5C v_active_coefficient view'sse. Skill hinnakirja-koefitsent segab.
Parandus (P1): loo SQL view v_active_coefficient (LADU 2D), tee skill puhtaks tarbijaks.

§4.3 Skeptik-agendi leid — pos_deep_memory paradoks (super-rikkumine)

R14pos_deep_memory "multi-layer artifact" paradoksFUNDAMENTAALNE
pos_deep_memory tabel (524 rida) elab 4 kihis korraga:
  • LADU 2 — PostgreSQL tabel
  • SEMANTIKA 4 — embedding_bge_m3 vektor + retrieval
  • APPS 6 — Erki + Eirikud on kasutajad, kes kirjutavad sinna sisu (user-generated)
  • Cross +B AUDIT — märkmed agentide otsuste kohta (decision log)
Karpathy-järeldus: 6+2 mudel ütleb "üks asi elab ühes kihis", aga pos_deep_memory elab neljas korraga. See pole eksin — see on fundamentaalne kategooriaviga mudelis.

Parandus (kandidaat — vt §6.E mudeli laiendus): sisseviia mõiste "user-generated knowledge artifact" — uus klass mis elab LAOS (2) aga kasutab SEMANTIKAT (4) ja sünnib APPS-is (6). Iga sellise tabeli rida tagged multi-layer atribuutidega.

§5 Sünergia-võimalused — 5 tugevamat

S1Pakk-müügi kaskaad A→B→C (Müügimees)
EUDR Pakk A (€8-15k sissetõmme — TimberTrace UI + EUDR DDS PDF, EU-sund) → upsell TerraNervus Pakk B (€20-30k, COMPUTE + SEMANTIKA + 7+1 kihti) → upsell Full Platform Pakk C (€40-60k Noble Woods-stiilis). Iga klient siseneb läbi A, kasvatame ARPU-d B/C kaudu.
S2Pakk D — Data Access API + partnerite-võrgustik (Müügimees)
data.forestsense.ai REST API + OAuth2 + rate-limiting. 3rd-party arendajad (metsanduslik startup, ülikool, Trimble integraator) ehitavad peale meie LADU. Hind €500-2k/kuu API-call. Pikaajaline moat: muudab Forestsense'i platvormiks, mitte ainult tooteks.
S3G-kiht per-tenant + BGE-M3 shared (Müügimees + Skeptik)
BGE-M3 embedding-mudel on universaalne (üks mudel kõikidele klientidele, jagatud COMPUTE Jetson). Graphify G-kiht (knowledge-graph) on per-tenant (kliendi enda metsa-graph, isiklikud märkmed). Cost-efficient scaling + per-tenant väärtus + GDPR-isolatsioon kliendi sisu üle.
S4layer_tag metadata + cohesion_check.py CI hook (Arhitekt)
Iga Supabase tabel / view / Edge Function / skill saab layer_tag ∈ {1, 2A-2F, 3, 4, 5A-5F, 6, +A, +B} metadata. Drift-detection cron 07:00 igahommikune: alarm kui uus tabel/EF/skill ilma tag'ita. Cohesion_check.py: iga Edge Function teeb ≤1 vastutusala, iga skill puudutab ≤3 kihti või on cross-cutting:true. See teeb 6+2 mudeli "operatsioonliks", mitte ainult whiteboard'iks.
S5Kiht 1.5 Data Lake (Skeptik) + EUDR DDS portable formaat
Sentinel-2 (~50TB Eesti+Läti kate 5a) ja teised suured ruumiandmed ei mahu PostgreSQL'is. Lisa Kiht 2.LAKE alamkiht: S3/MinIO + Parquet/Iceberg objektisalv. Hot (Postgres OLTP) → Warm (Parquet) → Cold (S3 Glacier). Müügisünergiast: EUDR DDS PDF + GeoPackage eksport portable kliendile = GDPR-vastav + lock-in vältimine + kliendi enda andmete kontroll.

§6 Soovitused — tsentraalse koordineerimise raamistik

§6.A — LADU autonoomia (data products eraldi rakendustest)

Iga "enrichment" (materialized view, embedding, join, RPC mis töötab ≥2 rakendusele) peab elama LADU 2D kataloogis 00_alus/ladu_v1.md. Iga data product'ile määratud: omanik-meeskond (data-team / app-team / shared), refresh-tsükkel (real-time / hourly / nightly / weekly), tarbijad (rakenduste loend), schema-stabiilsus SLA (v1.0 / breaking changes 30 päeva ette). See on PR #99 kandidaat (vt §8).

§6.B — Leppe-katalog (API + compliance + reeglid masinaloetav)

Praegu Kiht 5 (LEPPED) on 6 alamkihti aga ühtset kataloogi pole. Soovitus: 00_alus/lepped_v1.md — kataloog kus iga lepe on tabelis kirje: {leppe_nimi, kiht (5A-5F), version (semver), kohaldumine, machine_readable_schema}. Migration 0050: contract_catalog Supabase tabel (LADU 2E master) — masinaloetav.

§6.C — Skill ümberkujundamine (per-kiht skill failid)

Praegu 31 skilli on hajutatud rakenduste järgi. Soovitus: 5 uut per-kiht skilli:

§6.D — Cross-project audit cron (CLAUDE.md PR #99 kandidaat)

Automaatne audit iga 4 nädala järel — kontrollib: layer_tag completeness, cohesion violations, RLS coverage, schema drift, data products owner-list. Tulemus saadetud agent_messages kui task Erkile (priority 3).

§6.E — 6+2 mudeli laiendus (kandidaat v1.1 — vt §9 Skeptik)

Skeptik avastas et 6+2 ei piisa 10x skaalal. Soovitan järgmise iteratsiooni kandidaadid (ei lukku praegu, aga jätame raporti lisana):

Need EI ole lukus 2026-05-23. Need on v1.1 kandidaadid mille Erki saab kaaluda järgmistes sessioonides. Praegu lukus on 6+2 mudel (lihtsus müügile ja töökorraldusele).

§7 Tegevuskava — prioritiseeritud action items

Hübriid struktuur (Erki valik): P0 punktid sisaldavad konkreetset SQL/skripti (kohe apply-valmis), P1/P2 punktid on abstraktsed (omaette sessioonidega konkretiseeritakse).

P0 — sel nädalal (3 punkti)

P0 #1

Loo 00_alus/ladu_v1.md — Forestsense LADU SSOT

Üks tõe-allikas LADU-le. Sisaldab: 56 tabelit klassifitseeritud alamkihtidesse 2A-2F + 5 view'd LADU 2D-s + per-tabel {owner_skill, refresh_cycle, consumers, rls_status, schema_version}. Mall:

# Forestsense LADU v1.0 — SSOT

## Kiht 2A — Ruumi+tabel ühendatud (20 tabelit)

### lvm_cirsmas (1133 rida) — LVM Geo Basic Auth layer 2
- **Owner skill:** lvm-geo-kaart-skill.md
- **Refresh:** nightly cron `lvm_geo_sync` (P1)
- **Consumers:** TerraNervus (Kiht #4 NFA, #5 Sortiment), TimberTrace (audit § 3 cirsma)
- **RLS status:** ⚠️ DISABLED (P1 fix)
- **Schema version:** v1.0 (stabiilne)
- **FK:** geom_4326 PostGIS geometry; jobcode VARCHAR (49% NULL)

### tma_tracking (100653 rida) — Machine Tracking TMA-st
... (jätku iga tabelile)

## Kiht 2D — Data products (5 view'd kasvavad)

### synth_sortiment_heatmap (TBD — Migration 0048)
- **Owner:** data-team
- **Refresh:** pg_cron 06:00 igapäev
- **Consumers:** terranervus_kiht_5, timbertrace_audit, 3rd_party_api
- **SLA:** schema v1.0 — breaking changes 30 päeva ette teatatud agent_messages-iga
...
P0 #2

Migration 0049 — synth_* + tma_workorder_match → LADU 2D + layer_tag

ALTER MATERIALIZED VIEW + COMMENT + layer_tag metadata. SQL DRY-RUN draft:

-- Migration 0049: Data product ownership + layer_tag
-- VS Eirik 2026-05-23 · PR #99 kandidaat

-- 1) layer_tag enum
CREATE TYPE layer_tag AS ENUM (
  '1','2A','2B','2C','2D','2E','2F','3','4',
  '5A','5B','5C','5D','5E','5F','6','+A','+B'
);

-- 2) Tabelite klassifikatsiooni meta-tabel
CREATE TABLE IF NOT EXISTS forestsense_layer_registry (
  object_name TEXT PRIMARY KEY,
  object_type TEXT NOT NULL CHECK (object_type IN ('table','view','mview','function','edge_function','skill')),
  layer layer_tag NOT NULL,
  owner_skill TEXT,
  refresh_cycle TEXT,
  consumers TEXT[],
  schema_version TEXT DEFAULT 'v1.0',
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- 3) Materialized view'd → LADU 2D
ALTER MATERIALIZED VIEW IF EXISTS synth_lepingu_risk
  RENAME TO ladu_synth_lepingu_risk;
COMMENT ON MATERIALIZED VIEW ladu_synth_lepingu_risk IS
  'LADU 2D data product · owner: data-team · refresh: pg_cron 06:00 · consumers: terranervus, timbertrace, 3rd_party';

ALTER MATERIALIZED VIEW IF EXISTS synth_sortiment_heatmap
  RENAME TO ladu_synth_sortiment_heatmap;
COMMENT ON MATERIALIZED VIEW ladu_synth_sortiment_heatmap IS
  'LADU 2D data product · owner: data-team · refresh: pg_cron 06:00 · consumers: terranervus_kiht_5';

ALTER MATERIALIZED VIEW IF EXISTS synth_nfa_overlap
  RENAME TO ladu_synth_nfa_overlap;
COMMENT ON MATERIALIZED VIEW ladu_synth_nfa_overlap IS
  'LADU 2D data product · owner: data-team · refresh: pg_cron 06:00 · consumers: terranervus_kiht_4, timbertrace_nfa_audit';

-- 4) Seed forestsense_layer_registry kõikidele teadaolevatele objektidele
INSERT INTO forestsense_layer_registry (object_name, object_type, layer, owner_skill, refresh_cycle, consumers) VALUES
  ('lvm_cirsmas', 'table', '2A', 'lvm-geo-kaart-skill', 'nightly', ARRAY['terranervus','timbertrace','janis_ui']),
  ('lvm_nogabali', 'table', '2A', 'lvm-geo-kaart-skill', 'nightly', ARRAY['terranervus','timbertrace','janis_ui']),
  ('tma_tracking', 'table', '2A', 'harvester-skill', 'nightly', ARRAY['timbertrace','janis_ui']),
  ('kpdc_documents', 'table', '2A', 'kpdc-saatelehed-skill', 'nightly', ARRAY['timbertrace','terranervus']),
  ('pos_deep_memory', 'table', '4', 'l1-malu-loomise-skill', 'realtime', ARRAY['vs_eirik','cowork_eirik','chat_eirik','janis_ui']),
  ('agent_messages', 'table', '5E', 'agent-messaging-bus-skill', 'realtime', ARRAY['*']),
  ('session_manifests', 'table', '+B', 'sessiooni-lopetamise-skill', 'realtime', ARRAY['vs_eirik']),
  ('unit_mapping', 'table', '2E', 'directo-skill', 'manual', ARRAY['directo_sync','raie_arve']),
  ('price_lists', 'table', '2C', 'hinnakirja-koefitsent-skill', 'manual', ARRAY['raie_arve_verifitseerimine']),
  ('ladu_synth_lepingu_risk', 'mview', '2D', NULL, 'pg_cron_06:00', ARRAY['terranervus','timbertrace','3rd_party']),
  ('ladu_synth_sortiment_heatmap', 'mview', '2D', NULL, 'pg_cron_06:00', ARRAY['terranervus_kiht_5']),
  ('ladu_synth_nfa_overlap', 'mview', '2D', NULL, 'pg_cron_06:00', ARRAY['terranervus_kiht_4','timbertrace_nfa']);
  -- ... (jätku kõigi 56 tabelitele + 12 Edge Functions + 31 skillile)

Apply-strateegia: draft Erki ülevaateks, mitte automaatne apply (PR #94 schema-reality-check + Erki autoriseering). Päästekork: BEGIN; ... ROLLBACK; kuni Erki kinnitab.

P0 #3

PR #99 lukk-tekst CLAUDE.md-sse

Vt §8 — lõplik tekst kopeerimis-valmis.

P1 — kahe nädala jooksul (5 punkti, abstraktselt)

P1 #1

Per-kiht skill failid

5 uut skilli (vt §6.C) — ladu-data-products, leppe-katalog, compute-jetson, semantika-kiht, identiteet-rls. Iga skill ~200-400 rida.

P1 #2

eudr-dds-pdf Edge Function refaktoring (R4/R12)

Jaota kaheks: eudr-dds-compliance (5B JSON) + render-pdf-from-template (Kiht 6 HTML→PDF). Tagasi-ühilduvus: vana endpoint kestab 30 päeva.

P1 #3

Migration 0051 — RLS coverage (R8/R11)

ENABLE ROW LEVEL SECURITY 19 tabelile + per-table policy. Eelkontroll: ükski Edge Function ei lakka töötamast (service-key kasutavad). Loo identiteet_v1.md SSOT.

P1 #4

Sõnastik markdown → masinaloetav tabel (R6)

terms_dictionary tabel (LADU 2E master) + ETL skript md → tabel + view v_sonastik (LADU 2D). API endpoint Janis UI'le.

P1 #5

Cohesion_check.py CI hook + layer_tag drift detection (S4)

Cron 07:00 igahommikune. agent_messages alarm kui uus tabel/EF/skill ilma tag'ita.

P2 — kuu (3 punkti, abstraktsed)

P2 #1

Müügimudeli pakkide A-D vormistamine (Müügimees)

4 paketti dokumentatsiooniks + indikatiivhinnad. Pilot-klient Pakk A-le (LATGRAN või TOFTAN).

P2 #2

Kiht 2.LAKE alamkiht (Skeptik §6.E)

S3/MinIO + Parquet/Iceberg PoC Sentinel-2 STAC andmete jaoks. Hot/warm/cold tiering strateegia.

P2 #3

6+2 → 6+4 mudel laiendus (vt §6.E)

Cross +C versioonimine + Cross +D performance/caching + multi-layer artifact mõiste pos_deep_memory paradoksile. Otsus järgmise vaheauditiga (kuu 2026-06-23).

§8 PR #99 kandidaat — lõplik lukk-tekst

Sisestatakse CLAUDE.md §3 Reeglid tabelisse pärast Erki kinnitust. Pikkus jälgib olemasolevate PR #94-#98 vormi.
| **#99** | **Data product ownership + layer_tag metadata** — kõik enrichment'id
(materialized view'd, embedding'ud, joinid, RPC funktsioonid mis töötavad
≥2 rakendusele) PEAVAD olema (a) LAOS dokumenteeritud kui "data products"
(`00_alus/ladu_v1.md` Kiht 2D), (b) tagged `layer` metadata-veeruga
forestsense_layer_registry tabelis (`{1, 2A-2F, 3, 4, 5A-5F, 6, +A, +B}`),
(c) varustatud owner-skilli viite + refresh-tsükli + tarbijate (rakenduste)
loendiga + schema-stabiilsus SLA-ga. **Põhjus 1:** rakenduskihi
materialiseeritud omandused → coupling murrub kui kolmas rakendus tahab samu
agregeeringuid; lock-in tehniliselt + müügistrateegias. **Põhjus 2:** ilma
metadata-tagging'uta on cohesion-test võimatu, drift-detection cron-il
pole signaali. **Erki nõue 2026-05-23:** *"applikatsioonid ei tohi olla
hardcoded omavahel kokku, vaid neid seob andmete kasutamine samas laost ja
üksteise täpselt sõnastatud tellimuste täitmine"* — Karpathy data-as-a-
product. **Kohaldumine:** iga `ladu_synth_*`, `tma_workorder_match`,
`pos_deep_memory.embedding_*`, `v_*` view, kõik agregaadid + cross-table
joinid + reusable RPC funktsioonid. **Erand:** Edge Function/skill mis
on ainult ühe rakenduse loogika (ei jagatav) tohib elada rakenduse omandus,
AGA peab olema `layer_tag = 6` (APPS) ja teiste rakenduste poolt ei
kasutata. **Migration-pool:** sel sessioonil diagnoositud 4 rikkumist
(R1 synth_*, R2 pos_deep_memory.embedding_bge_m3, R3 tma_workorder_match,
R4 eudr-dds reeglid) → P0 #2 (Migration 0049). |

§9 Red Team kontra-argumendid — 3 agendi süntees

3 Plan sub-agenti (Arhitekt / Müügimees / Skeptik) andsid kontra-argumente. Süntees kompaktselt — täisvastused on iga agendi tüpograafia "(Plan agent: ...)" abil §4-§6 sees viidatud.

Arhitekt — peamised hoiatused

Müügimees — peamised hoiatused

Skeptik (Red Team) — peamised hoiatused (kõige tugevamad)

Süntees: 6+2 mudel kestab praegu (lihtsus müügile + meeskonna-koordinatsioonile). Aga v1.1 kandidaadid §6.E on hädavajalik enne 10x skaalat. Erki saab kaaluda järgmise vaheauditi (2026-06-23 kuu).

§10 Mälu-struktuuri ettepanekud (PR #95)

Sel sessioonil tehtavad INSERT-id (prognoos — täituvad pärast HTML salvestamist)

Uued failid sel sessioonil

P0/P1 action item'iga loodavad failid (järgmised sessioonid)

L1 olek

Ettepanekud

  1. CLAUDE.md PR #99: data product ownership + layer_tag reegel (lõplik tekst §8). Sisestatakse pärast Erki kinnitust.
  2. MEMORY.md §A SSOT: lisa ssot_forestsense_arhitektuur.md rida (uus SSOT, kõige tähtsam projekti-vaade).
  3. MEMORY.md §D Tehnilised viited: lisa 00_alus/ladu_v1.md viide pärast P0 #1 loomist.
  4. Skill registry: 5 per-kiht skilli (vt §6.C) — P1 sessioonid.
  5. L1: käesolev raport INSERT category='otsus' (1024-dim BGE-M3 embedding ootel nightly Jetson cron'iga).
  6. G-kiht: pärast SSOT loomist graphify update . et globaalne graaf näeks uut sõlme.

§11 Kaardistuse õppetunnid (PR #98)

Sel sessioonil kaartidega ei tegeleta otseselt — see on cross-system süsteemiarhitektuuri vaheaudit, mitte kaardistus.

Sektsioon eksisteerib vastavalt PR #98 kohustusele. Sisuline märkus: viitame TerraNervus kihtide #1, #4, #5 (lepingu-risk, NFA audit, sortiment-heatmap) sõltuvustele TimberTrace andmetest. Uue 6+2 mudeli järgi need andmeprodukti (synth_*) kuuluvad LADU 2D-sse, mitte rakendusse. Järgmise kaardi-sessiooni puhul tuleb sellele uuele lepingule (PR #99) viidata — kihti #1/#4/#5 visuaal-toode loeb LADU 2D view'd, mitte rakenduse-sisest cache'i.

Tehniliste õppetundide-vaade: kaks tooret ülemandimispromptit antud paralleelselt (TerraNervus + TimberTrace) andsid piisavalt konteksti et üldagent saaks teha 3-kihilise süsteemi-vaate ilma kontaktivaba. Karpathy-stiilis peegeldus (data-as-a-product mantra) muutis terve raami radikaalselt — lugemine "kahe rakenduse integratsioon" → "süsteemi-arhitektuur 6+2". See peaks olema standardne praktika — iga "integratsiooni" vaheauditi puhul küsida kõigepealt: "kas need kaks asja on tegelikult rakendused mis teineteisega liidestuvad, või on nad kaks tarbijat mille vahel asub jagatud LADU?"