TC$mC$ tulos on suoraan sanoen **tC$ydellinen**. Se osoittaa tarkalleen, miksi
reaaliaikainen CDP-kysely on tC$ysin ylivoimainen verrattuna jC$lkikC$teen
tehtC$vC$C$n DOM-matematiikkaan.
TC$ssC$ nC$kyy modernin verkkosovelluksen (kuten WhatsAppin) anatomia:
1. **`raw_element`:** Hiiri osui mikroskooppiseen, nC$kymC$ttC6mC$C$n
`<p>`-tagiin (jota React/Lexical-editori kC$yttC$C$ tekstin renderC6intiin).
2. **`target_element`:** Koodisi C$lysi "kuplia" (bubble up) ylC6spC$in
DOM-puussa ja lC6ysi itse semanttisen sC$iliC6n, jolla on merkitystC$.
NC$istC$ tiedoista voimme rakentaa tC$ysin murtumattoman, Enterprise-tason
valintalogiikan (Selector Hierarchy).
### Miten nC$mC$ tiedot otetaan kC$yttC6C6n? (PrioriteettijC$rjestelmC$)
KC$C$ntC$jC$mme (Playbook Studion `main.py`) tulee kC$yttC$C$ nC$itC$
attribuutteja **tarkassa tC$rkeysjC$rjestyksessC$**. Kun CDP palauttaa osuman,
skripti kC$y listaa alaspC$in ja valitsee ensimmC$isen, joka lC6ytyy:
**Prioriteetti 1: Testi-ID:t (Kultastandardi)**
* **MitC$ katsotaan:** `test_id` (data-testid) tai `data-som-id`.
* **TC$ssC$ tapauksessa:** `"conversation-compose-box-input"`
* **Miksi:** `data-testid` on kehittC$jien koodiin jC$ttC$mC$ pysyvC$ ankkuri
juuri automaatiotestausta varten. Se ei muutu, vaikka elementin vC$ri, luokat
tai kieli muuttuisi.
* **Lopullinen YAML target:** `"[data-testid='conversation-compose-box-input']"
`
**Prioriteetti 2: Aria-Label (Saavutettavuus)**
* **MitC$ katsotaan:** `aria_label`.
* **TC$ssC$ tapauksessa:** `"Kirjoita viesti ryhmC$lle: HAUKI_GEM"`
* **Miksi:** Jos testi-ID:tC$ ei ole, aria-label on seuraavaksi paras, koska
se on tarkoitettu ruudunlukijoille ja on siksi semanttisesti tarkka.
* **Huomio:** Koska tC$ssC$ on dynaamista dataa ("HAUKI_GEM"), tC$hC$n astuu
mukaan aiemmin rakentamasi **Gemma-kuraattori**. Gemma lyhentC$isi tC$mC$n
todennC$kC6isesti muotoon "Kirjoita viesti", jolloin YAML targetiksi tulisi
joustava `contains='Kirjoita viesti'`.
**Prioriteetti 3: Rooli + Tila (Role & State)**
* **MitC$ katsotaan:** `role` yhdistettynC$ muihin ominaisuuksiin (esim.
`contenteditable`).
* **TC$ssC$ tapauksessa:** `role="textbox"` ja `contenteditable="true"`.
* **Miksi:** Vaikka sovelluksen kieli vaihtuisi englanniksi, textbox on aina
textbox.
* **Lopullinen YAML target:** `"role='textbox'"`
**Prioriteetti 4: Puhdas teksti**
* **MitC$ katsotaan:** Elementin nC$kyvC$ teksti (esim. painikkeen teksti).
* **Lopullinen YAML target:** `"text='LC$hetC$'"`
### Arkkitehtuurinen muutos: Nauhoittajan ja KC$C$ntC$jC$n tyC6njako
TC$mC$ lC6ydC6s yksinkertaistaa koko Omega Meshin opetusputkea radikaalisti:
1. **`x11_listener.py` (Nauhoittaja) tekee raskaan tyC6n:**
Aina kun ihminen klikkaa tyC6pC6ytC$C$, kuuntelija kutsuu vC$littC6mC$sti
`cdp_sniper.py` -logiikkaa lennosta. Se tallentaa `events.jsonl` -lokiin
perinteisen klikkaustiedon lisC$ksi suoraan tuon C$sken saamasi CDP-JSONin.
2. **`main.py` (KC$C$ntC$jC$) muuttuu tyhmC$ksi ja nopeaksi:**
Sen ei tarvitse enC$C$ ladata massiivisia DOM.json-tiedostoja eikC$ harrastaa
fuzzy matching -matematiikkaa tai offset-arvailuja. Se vain lukee
event-lokista CDP:n palauttaman tC$ydellisen targetin ja soveltaa yllC$ olevaa
prioriteettijC$rjestelmC$C$ muodostaakseen YAML-rivin.
### Seuraava askel
Jos tC$mC$ konsepti kuulostaa oikealta, voimme seuraavaksi delegoida uudelle
chatille tehtC$vC$ksi integroida tC$mC$ CDP-kysely suoraan osaksi
`x11_listener.py` -nauhoittajaa ja pC$ivittC$C$ `main.py` hyC6dyntC$mC$C$n
tuota uutta dataa. Haluatko, ettC$ kirjoitan valmiin promptin tC$tC$
integraatiota varten?