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.
00_alus/ladu_v1.md — Forestsense LADU SSOT (56 tabelit + 5 view'd alamkihtidesse 2A-2F klassifitseeritud + owner-skill + RLS-staatus)synth_* + tma_workorder_match → COMMENT 'LADU 2D data product' + layer_tag metadata)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.
| Kiht | Tabelid | Ridade arv kokku |
|---|---|---|
| LADU 2A ruumi+tabel | features 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 loodusega | directo_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 products | audit_findings 0 · transport_verifications 0 · invoice_verifications 1 · payment_schedule 0 · directo_kogus_lookup 0 · pr_rules 31 · pos_agent_compliance 18 | 50 |
| LADU 2E master data | unit_mapping 83 · attribute_definitions 0 · data_sources 22 · skills_registry 22 · integration_inventory 46 · agent_registry 18 | 191 |
| LADU 2F temporal | watchdog_log 8430 · task_state_log 0 · sync_log 380 · observations 0 · feature_relations 0 · lvm_etl_sync_log 0 | 8810 |
| Kiht 4 SEMANTIKA | pos_deep_memory 524 · agent_state 14 | 538 |
| Kiht 5E orkest. | agent_messages 1341 · agent_tasks 1 | 1342 |
| Cross +B AUDIT | session_manifests 34 | 34 |
| Postgres süsteemne | spatial_ref_sys 0 | 0 |
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.
| Kiht | Edge Function | Roll |
|---|---|---|
| Kiht 1 INGEST | t4-sync · directo-sync · evr-sync · parse-tma · directo-xml-probe · hpr-prd-ingest | ETL välismaailmast LADU 2A/2C tabelitesse |
| Kiht 3 COMPUTE | embed-message | BGE-M3 embedding generation (HTTP API → Jetson või cloud GPU) |
| Kiht 4 SEMANTIKA | search-memory | RPC otsing pos_deep_memory peal (cosine similarity) |
| Kiht 5B+6 SEGA | eudr-dds-pdf | RIKKUMINE R12 — compliance (5B) + PDF render (6) ühes funktsioonis |
| Kiht 6 APP | red-team-trigger | Red team workflow trigger |
| Cross +A | handle-new-user | Auth callback |
| Cross +B | audit-advisor | Compliance audit advisor |
| Kiht | Skill 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 |
| Kiht | Failid |
|---|---|
| Kiht 5F sõnastik | forestsense_os_sonastik.md · CLAUDE.md (käitumusreeglid) · pos_onboarding_v1.md |
| Kiht 2 LADU | Supabase_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-spec | project_kaardi_aju_v0.md · ssot_timbertrace.md · NW_laenu_strateegia_v0.md · NW_noukogu_kontekst_kiirviide.md · Disainer_v0.md |
| Cross +A IDENTITEET | Ligipaasumaatriks_v0.md · identiteet_v1.md PUUDUB |
| Cross +B AUDIT | memory_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).
semantika-kiht-skill.md + RPC search_bge_m3() + tarbijate loend (TerraNervus, Janis UI, TimberTrace sisendite L1, ...).tma-workorder-match-data-product.md (LADU 2D — view definitsioon) ja spatio-temporal-matching-rule.md (LEPPED 5C — algoritm + parameetrid ε_dist, ε_time).eudr-dds-compliance (JSON väljund) + render-pdf-from-template (HTML-engine).v_active_coefficient (LADU 2D) + verify_invoice_rule RPC (LEPPED 5A). Skill kasutab RPC-d, mitte ei rakenda otse.terms_dictionary) + view v_sonastik (LADU 2D). Markdown jääb dokumentatsiooniks kogemus-stiilis.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).FOR ALL USING (true) eksplitsiitselt + audit-trail).agent_registry = autonomous actors. skills_registry = reusable knowledge modules. integration_inventory = external endpoints (URL + auth).eudr-dds-compliance (Kiht 5B, JSON {du_code, status, vol_m3, geom_centroid, partners[]}) + render-pdf-from-template (Kiht 6, HTML→PDF).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.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.
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).
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.
Praegu 31 skilli on hajutatud rakenduste järgi. Soovitus: 5 uut per-kiht skilli:
00_alus/skills/ladu-data-products-skill.md — LADU 2D haldus, omanikud, refresh-rütm00_alus/skills/leppe-katalog-skill.md — Kiht 5 6 alamkihti + machine-readable schema00_alus/skills/compute-jetson-skill.md — Kiht 3 hardware + AI-mudelite haldus00_alus/skills/semantika-kiht-skill.md — Kiht 4 embedding + Graphify + sõnastik-mapping00_alus/skills/identiteet-rls-skill.md — Cross +A multi-tenant + policy coverage
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).
Skeptik avastas et 6+2 ei piisa 10x skaalal. Soovitan järgmise iteratsiooni kandidaadid (ei lukku praegu, aga jätame raporti lisana):
pos_deep_memory.embedding_model = 'bge-m3@v1.5'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).
Ü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 ...
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.
Vt §8 — lõplik tekst kopeerimis-valmis.
5 uut skilli (vt §6.C) — ladu-data-products, leppe-katalog, compute-jetson, semantika-kiht, identiteet-rls. Iga skill ~200-400 rida.
Jaota kaheks: eudr-dds-compliance (5B JSON) + render-pdf-from-template (Kiht 6 HTML→PDF). Tagasi-ühilduvus: vana endpoint kestab 30 päeva.
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.
terms_dictionary tabel (LADU 2E master) + ETL skript md → tabel + view v_sonastik (LADU 2D). API endpoint Janis UI'le.
Cron 07:00 igahommikune. agent_messages alarm kui uus tabel/EF/skill ilma tag'ita.
4 paketti dokumentatsiooniks + indikatiivhinnad. Pilot-klient Pakk A-le (LATGRAN või TOFTAN).
S3/MinIO + Parquet/Iceberg PoC Sentinel-2 STAC andmete jaoks. Hot/warm/cold tiering strateegia.
Cross +C versioonimine + Cross +D performance/caching + multi-layer artifact mõiste pos_deep_memory paradoksile. Otsus järgmise vaheauditiga (kuu 2026-06-23).
| **#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). |
layers: [1, 2A, 2D, 5B, 6].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).
pos_deep_memory 1 INSERT (category='otsus', subject='Vaheaudit Forestsense arhitektuur 6+2 mudel 2026-05-23' + PR #99 kandidaat)agent_messages 1 INSERT (from_agent='vs_eirik' → to_agent='erki', task_done)session_manifests 1 INSERT (compliance audit 14/14 tõenäoliselt)memory/ssot_forestsense_arhitektuur.md (uus SSOT)05_väljundid/vaheaudit_forestsense_arhitektuur_2026-05-23.html (käesolev raport)00_alus/ladu_v1.md00_alus/identiteet_v1.mdssot_forestsense_arhitektuur.md rida (uus SSOT, kõige tähtsam projekti-vaade).00_alus/ladu_v1.md viide pärast P0 #1 loomist.graphify update . et globaalne graaf näeks uut sõlme.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?"