Files
boc/projects/landvex/20-automation/lvx-ingest-spec.md
T
Bernt 7d40cf95bf landvex: IOL v3 + Identify API + Neo4j-graf + byggpipeline
- FastAPI Identify API (port 8081)
- Neo4j propertygraf (64 noder, 80 kanter)
- Ingest-pipeline (Python)
- Byggscript + integrationstester
- Docker Compose setup
2026-07-05 05:55:48 +00:00

3.8 KiB

Landvex Ingest — automationsspec v0

Datafabriken: från källa till validerad graf utan handpåläggning

Kedjan

Källor → Skördare → Källpaket → Extraktor (LLM) → Kandidatposter → Ingest (deterministisk) → Master + Graf + Bounty-förslag → Rapport

Två halvor med olika natur:

  • Skörd + extraktion är probabilistisk (sök, läs, referera). Får föreslå — aldrig besluta.
  • Ingest är deterministisk kod (ingest.py). Den beslutar: upplöser entiteter, verkställer merge-policyn, mintar ID, validerar, bygger grafen. Samma indata ger alltid samma bibliotek.

Stegen

1. Skördare. Hämtar källor per kö (se Drift). Output: källpaket — referat med URL-lista, aldrig kopierad text. Rätten till originalet stannar hos källan; biblioteket bär referat + referens.

2. Extraktor. LLM med lvx-extraktionsprompt.md som kontrakt. Output: kandidatposter i patch-format. Får högst föreslå nivån källbelagd.

3. Ingest (ingest.py).

  • Entitetsupplösning: lvx_id → slug → namnlikhet ≥ 0,88 (difflib). Dublett stoppar ny.
  • Merge-policy: källor unionas på URL; standarder dedupe:as på normaliserad beteckning (så att "EN 1917 (kartläggs)" ersätts av "EN 1917:2002"); tomma fält fylls; ifyllda fält skrivs aldrig över — konflikter loggas till granskningskö.
  • Verifieringstrappan: lyft sker endast uppåt, och källbelagd kräver icke-tom källista. Fältverifierad/tillverkarbekräftad kan bara sättas av foto- respektive portalflödet.
  • ID-mintning: lvx-id-register.json håller nästa nummer per serie; register skrivs tillbaka atomärt; ID återanvänds aldrig.
  • Validering: samma regler som konsolideringen (ID-format, domän, namn sv/en, predikatenum, problem-källa, parent, källkrav). Fel ⇒ batchen flaggas.
  • Grafexport: kantlista regenereras ur posterna varje körning — grafen är alltid härledd, aldrig handredigerad.

4. Bounty-generatorn. Varje körning skannar posterna: källbelagd + OCR-fält + ingen aktiv bounty ⇒ bounty-förslag. Flyhjulet matas automatiskt av ny data.

5. Rapport. Körningslogg: uppdaterade/nya, nivålyft, källor, konflikter, valideringsfel, grafstatistik.

Drift: tre köer in i skördaren

Trigger Exempel
Schemalagd Domän-/klasscykel "Alla TRP-standarder omkontrolleras kvartalsvis"
Kunddriven POST /v0/feedback + svaga identify-svar Okänd modell i Leeds ⇒ riktad skörd + bounty
Fält Zoomer-foton godkända OCR-data ⇒ individposter + nivålyft till fältverifierad

Kunddrivna kön är SaaS-motorn: betald efterfrågan bestämmer var datafabriken gräver härnäst, och kostnaden bärs av intäkten den skapar.

Kostnadsmåttet

Kostnad per verifierat faktum = (skörd + extraktion + granskning) / antal nivålyft & nya källbelagda fält. Våg 7-demon: 3 sökningar + 1 korsreferens gav 4 nivålyft, 9 nya källor, 9 standardposter och 1 ny modell — korsreferenssteget (återanvänd källa, noll ny skörd) är gratis-lyften som automationen ska hitta själv i produktionen.

Miljönot

I denna arbetsyta: Claude är skördare + extraktor (web_search/web_fetch), containern kör ingest. I produktion: crawler med källvitlista + LLM-API bakom extraktionsprompten + granskningskö-UI för konflikter. ingest.py är samma kod i båda miljöerna.

Filkarta

Fil Roll
intag/kallpaket-*.json Skördarens output
intag/kandidatposter-*.json Extraktorns output
lvx-extraktionsprompt.md LLM-kontraktet
lvx-id-register.json ID-serier (mintning)
ingest.py Pipelinens kärna
lvx-klassposter-master-vN.json, lvx-graf-kanter-vN.json Beslutade utdata
lvx-bounty-kandidater-*.json Flyhjulsförslag till granskning